slirp: Added support for BOOTFILE and DNSSEARCH settings
This commit is contained in:
parent
dabdcfd2bd
commit
42405a4463
2 changed files with 63 additions and 8 deletions
|
@ -225,7 +225,6 @@ return 0;
|
||||||
|
|
||||||
void qemu_notify_event(void)
|
void qemu_notify_event(void)
|
||||||
{
|
{
|
||||||
fprintf (stderr, "qemu_notify_event() called\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_MSC_VER)
|
#if defined(_MSC_VER)
|
||||||
|
|
|
@ -130,7 +130,10 @@ struct sim_slirp {
|
||||||
int dhcpmgmt;
|
int dhcpmgmt;
|
||||||
struct in_addr vdhcp_start;
|
struct in_addr vdhcp_start;
|
||||||
struct in_addr vnameserver;
|
struct in_addr vnameserver;
|
||||||
|
char *boot_file;
|
||||||
char *tftp_path;
|
char *tftp_path;
|
||||||
|
char *dns_search;
|
||||||
|
char **dns_search_domains;
|
||||||
struct redir_tcp_udp *rtcp;
|
struct redir_tcp_udp *rtcp;
|
||||||
GArray *gpollfds;
|
GArray *gpollfds;
|
||||||
SOCKET db_chime; /* write packet doorbell */
|
SOCKET db_chime; /* write packet doorbell */
|
||||||
|
@ -192,6 +195,15 @@ while (*tptr && !err) {
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (0 == MATCH_CMD (gbuf, "BOOTFILE")) {
|
||||||
|
if (cptr && *cptr)
|
||||||
|
slirp->boot_file = g_strdup (cptr);
|
||||||
|
else {
|
||||||
|
sim_printf ("Missing DHCP Boot file name\n");
|
||||||
|
err = 1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if ((0 == MATCH_CMD (gbuf, "NAMESERVER")) ||
|
if ((0 == MATCH_CMD (gbuf, "NAMESERVER")) ||
|
||||||
(0 == MATCH_CMD (gbuf, "DNS"))) {
|
(0 == MATCH_CMD (gbuf, "DNS"))) {
|
||||||
if (cptr && *cptr)
|
if (cptr && *cptr)
|
||||||
|
@ -202,6 +214,31 @@ while (*tptr && !err) {
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (0 == MATCH_CMD (gbuf, "DNSSEARCH")) {
|
||||||
|
if (cptr && *cptr) {
|
||||||
|
int count = 0;
|
||||||
|
char *name;
|
||||||
|
|
||||||
|
slirp->dns_search = g_strdup (cptr);
|
||||||
|
name = slirp->dns_search;
|
||||||
|
do {
|
||||||
|
++count;
|
||||||
|
slirp->dns_search_domains = realloc (slirp->dns_search_domains, (count + 1)*sizeof(char *));
|
||||||
|
slirp->dns_search_domains[count] = NULL;
|
||||||
|
slirp->dns_search_domains[count-1] = name;
|
||||||
|
name = strchr (name, ':');
|
||||||
|
if (name) {
|
||||||
|
*name = '\0';
|
||||||
|
++name;
|
||||||
|
}
|
||||||
|
} while (name && *name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sim_printf ("Missing DNS search list\n");
|
||||||
|
err = 1;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (0 == MATCH_CMD (gbuf, "GATEWAY")) {
|
if (0 == MATCH_CMD (gbuf, "GATEWAY")) {
|
||||||
if (cptr && *cptr) {
|
if (cptr && *cptr) {
|
||||||
char *slash = strchr (cptr, '/');
|
char *slash = strchr (cptr, '/');
|
||||||
|
@ -272,8 +309,9 @@ if ((slirp->vdhcp_start.s_addr == 0) && slirp->dhcpmgmt)
|
||||||
if (slirp->vnameserver.s_addr == 0)
|
if (slirp->vnameserver.s_addr == 0)
|
||||||
slirp->vnameserver.s_addr = htonl(ntohl(slirp->vnetwork.s_addr) | 3);
|
slirp->vnameserver.s_addr = htonl(ntohl(slirp->vnetwork.s_addr) | 3);
|
||||||
slirp->slirp = slirp_init (0, slirp->vnetwork, slirp->vnetmask, slirp->vgateway,
|
slirp->slirp = slirp_init (0, slirp->vnetwork, slirp->vnetmask, slirp->vgateway,
|
||||||
NULL, slirp->tftp_path, NULL, slirp->vdhcp_start,
|
NULL, slirp->tftp_path, slirp->boot_file,
|
||||||
slirp->vnameserver, NULL, (void *)slirp);
|
slirp->vdhcp_start, slirp->vnameserver,
|
||||||
|
(const char **)(slirp->dns_search_domains), (void *)slirp);
|
||||||
|
|
||||||
if (_do_redirects (slirp->slirp, slirp->rtcp)) {
|
if (_do_redirects (slirp->slirp, slirp->rtcp)) {
|
||||||
sim_slirp_close (slirp);
|
sim_slirp_close (slirp);
|
||||||
|
@ -321,6 +359,9 @@ struct redir_tcp_udp *rtmp;
|
||||||
if (slirp) {
|
if (slirp) {
|
||||||
g_free (slirp->args);
|
g_free (slirp->args);
|
||||||
g_free (slirp->tftp_path);
|
g_free (slirp->tftp_path);
|
||||||
|
g_free (slirp->boot_file);
|
||||||
|
g_free (slirp->dns_search);
|
||||||
|
g_free (slirp->dns_search_domains);
|
||||||
while ((rtmp = slirp->rtcp)) {
|
while ((rtmp = slirp->rtcp)) {
|
||||||
slirp_remove_hostfwd(slirp->slirp, rtmp->is_udp, rtmp->inaddr, rtmp->lport);
|
slirp_remove_hostfwd(slirp->slirp, rtmp->is_udp, rtmp->inaddr, rtmp->lport);
|
||||||
slirp->rtcp = rtmp->next;
|
slirp->rtcp = rtmp->next;
|
||||||
|
@ -353,10 +394,12 @@ fprintf (st, "%s",
|
||||||
"NAT options:\n"
|
"NAT options:\n"
|
||||||
" DHCP{=dhcp_start_address} Enables DHCP server and specifies\n"
|
" DHCP{=dhcp_start_address} Enables DHCP server and specifies\n"
|
||||||
" guest LAN DHCP start IP address\n"
|
" guest LAN DHCP start IP address\n"
|
||||||
|
" BOOTFILE=bootfilename specifies DHCP returned Boot Filename\n"
|
||||||
" TFTP=tftp-base-path Enables TFTP server and specifies\n"
|
" TFTP=tftp-base-path Enables TFTP server and specifies\n"
|
||||||
" base file path\n"
|
" base file path\n"
|
||||||
" NAMESERVER=nameserver_ipaddres specifies DHCP nameserver IP address\n"
|
" NAMESERVER=nameserver_ipaddres specifies DHCP nameserver IP address\n"
|
||||||
" DNS=nameserver_ipaddres specifies DHCP nameserver IP address\n"
|
" DNS=nameserver_ipaddres specifies DHCP nameserver IP address\n"
|
||||||
|
" DNSSEARCH=domain{:domain{:domain}} specifies DNS Domains search suffixes\n"
|
||||||
" GATEWAY=host_ipaddress{/masklen} specifies LAN gateway IP address\n"
|
" GATEWAY=host_ipaddress{/masklen} specifies LAN gateway IP address\n"
|
||||||
" NETWORK=network_ipaddress{/masklen} specifies LAN network address\n"
|
" NETWORK=network_ipaddress{/masklen} specifies LAN network address\n"
|
||||||
" UDP=port:address:internal-port maps host UDP port to guest port\n"
|
" UDP=port:address:internal-port maps host UDP port to guest port\n"
|
||||||
|
@ -424,10 +467,23 @@ if ((slirp == NULL) || (slirp->slirp == NULL))
|
||||||
return;
|
return;
|
||||||
fprintf (st, "NAT args: %s\n", slirp->args);
|
fprintf (st, "NAT args: %s\n", slirp->args);
|
||||||
fprintf (st, "NAT network setup:\n");
|
fprintf (st, "NAT network setup:\n");
|
||||||
fprintf (st, " gateway =%s/%d\n", inet_ntoa(slirp->vgateway), slirp->maskbits);
|
fprintf (st, " gateway =%s/%d", inet_ntoa(slirp->vgateway), slirp->maskbits);
|
||||||
|
fprintf (st, "(%s)\n", inet_ntoa(slirp->vnetmask));
|
||||||
fprintf (st, " DNS =%s\n", inet_ntoa(slirp->vnameserver));
|
fprintf (st, " DNS =%s\n", inet_ntoa(slirp->vnameserver));
|
||||||
if (slirp->vdhcp_start.s_addr != 0)
|
if (slirp->vdhcp_start.s_addr != 0)
|
||||||
fprintf (st, " dhcp_start =%s\n", inet_ntoa(slirp->vdhcp_start));
|
fprintf (st, " dhcp_start =%s\n", inet_ntoa(slirp->vdhcp_start));
|
||||||
|
if (slirp->boot_file)
|
||||||
|
fprintf (st, " dhcp bootfile =%s\n", slirp->boot_file);
|
||||||
|
if (slirp->dns_search_domains) {
|
||||||
|
char **domains = slirp->dns_search_domains;
|
||||||
|
|
||||||
|
fprintf (st, " DNS domains =");
|
||||||
|
while (*domains) {
|
||||||
|
fprintf (st, "%s%s", (domains != slirp->dns_search_domains) ? ", " : "", *domains);
|
||||||
|
++domains;
|
||||||
|
}
|
||||||
|
fprintf (st, "\n");
|
||||||
|
}
|
||||||
if (slirp->tftp_path)
|
if (slirp->tftp_path)
|
||||||
fprintf (st, " tftp prefix =%s\n", slirp->tftp_path);
|
fprintf (st, " tftp prefix =%s\n", slirp->tftp_path);
|
||||||
rtmp = slirp->rtcp;
|
rtmp = slirp->rtcp;
|
||||||
|
|
Loading…
Add table
Reference in a new issue