mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
slirp: Add domain-search option to slirp's DHCP server
This patch will allow the user to include the domain-search option in replies from the built-in DHCP server. The domain suffixes can be specified by adding dnssearch= entries to the "-net user" parameter. [Jan: tiny style adjustments] Signed-off-by: Klaus Stengel <Klaus.Stengel@asamnet.de> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
This commit is contained in:
parent
1a89b60885
commit
63d2960bc4
9 changed files with 392 additions and 9 deletions
35
net/slirp.c
35
net/slirp.c
|
@ -136,7 +136,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
|||
const char *vhostname, const char *tftp_export,
|
||||
const char *bootfile, const char *vdhcp_start,
|
||||
const char *vnameserver, const char *smb_export,
|
||||
const char *vsmbserver)
|
||||
const char *vsmbserver, const char **dnssearch)
|
||||
{
|
||||
/* default settings according to historic slirp */
|
||||
struct in_addr net = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
|
||||
|
@ -242,7 +242,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
|||
s = DO_UPCAST(SlirpState, nc, nc);
|
||||
|
||||
s->slirp = slirp_init(restricted, net, mask, host, vhostname,
|
||||
tftp_export, bootfile, dhcp, dns, s);
|
||||
tftp_export, bootfile, dhcp, dns, dnssearch, s);
|
||||
QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
|
||||
|
||||
for (config = slirp_configs; config; config = config->next) {
|
||||
|
@ -699,6 +699,31 @@ net_init_slirp_configs(const StringList *fwd, int flags)
|
|||
}
|
||||
}
|
||||
|
||||
static const char **slirp_dnssearch(const StringList *dnsname)
|
||||
{
|
||||
const StringList *c = dnsname;
|
||||
size_t i = 0, num_opts = 0;
|
||||
const char **ret;
|
||||
|
||||
while (c) {
|
||||
num_opts++;
|
||||
c = c->next;
|
||||
}
|
||||
|
||||
if (num_opts == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ret = g_malloc((num_opts + 1) * sizeof(*ret));
|
||||
c = dnsname;
|
||||
while (c) {
|
||||
ret[i++] = c->value->str;
|
||||
c = c->next;
|
||||
}
|
||||
ret[i] = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int net_init_slirp(const NetClientOptions *opts, const char *name,
|
||||
NetClientState *peer)
|
||||
{
|
||||
|
@ -706,6 +731,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
|
|||
char *vnet;
|
||||
int ret;
|
||||
const NetdevUserOptions *user;
|
||||
const char **dnssearch;
|
||||
|
||||
assert(opts->kind == NET_CLIENT_OPTIONS_KIND_USER);
|
||||
user = opts->user;
|
||||
|
@ -714,6 +740,8 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
|
|||
user->has_ip ? g_strdup_printf("%s/24", user->ip) :
|
||||
NULL;
|
||||
|
||||
dnssearch = slirp_dnssearch(user->dnssearch);
|
||||
|
||||
/* all optional fields are initialized to "all bits zero" */
|
||||
|
||||
net_init_slirp_configs(user->hostfwd, SLIRP_CFG_HOSTFWD);
|
||||
|
@ -722,7 +750,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
|
|||
ret = net_slirp_init(peer, "user", name, user->q_restrict, vnet,
|
||||
user->host, user->hostname, user->tftp,
|
||||
user->bootfile, user->dhcpstart, user->dns, user->smb,
|
||||
user->smbserver);
|
||||
user->smbserver, dnssearch);
|
||||
|
||||
while (slirp_configs) {
|
||||
config = slirp_configs;
|
||||
|
@ -731,6 +759,7 @@ int net_init_slirp(const NetClientOptions *opts, const char *name,
|
|||
}
|
||||
|
||||
g_free(vnet);
|
||||
g_free(dnssearch);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue