summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--net.c83
-rw-r--r--net.h4
-rw-r--r--vl.c9
3 files changed, 55 insertions, 41 deletions
diff --git a/net.c b/net.c
index a2507f991c..8e4a752dc6 100644
--- a/net.c
+++ b/net.c
@@ -650,7 +650,6 @@ static void config_error(Monitor *mon, const char *fmt, ...)
} else {
fprintf(stderr, "qemu: ");
vfprintf(stderr, fmt, ap);
- exit(1);
}
va_end(ap);
}
@@ -684,16 +683,16 @@ const char *legacy_bootp_filename;
static QTAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
QTAILQ_HEAD_INITIALIZER(slirp_stacks);
-static void slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
+static int slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
+ int legacy_format);
+static int slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
int legacy_format);
-static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
- int legacy_format);
#ifndef _WIN32
static const char *legacy_smb_export;
-static void slirp_smb(SlirpState *s, Monitor *mon, const char *exported_dir,
- struct in_addr vserver_addr);
+static int slirp_smb(SlirpState *s, Monitor *mon, const char *exported_dir,
+ struct in_addr vserver_addr);
static void slirp_smb_cleanup(SlirpState *s);
#else
static inline void slirp_smb_cleanup(SlirpState *s) { }
@@ -848,11 +847,13 @@ static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model,
for (config = slirp_configs; config; config = config->next) {
if (config->flags & SLIRP_CFG_HOSTFWD) {
- slirp_hostfwd(s, mon, config->str,
- config->flags & SLIRP_CFG_LEGACY);
+ if (slirp_hostfwd(s, mon, config->str,
+ config->flags & SLIRP_CFG_LEGACY) < 0)
+ return -1;
} else {
- slirp_guestfwd(s, mon, config->str,
- config->flags & SLIRP_CFG_LEGACY);
+ if (slirp_guestfwd(s, mon, config->str,
+ config->flags & SLIRP_CFG_LEGACY) < 0)
+ return -1;
}
}
#ifndef _WIN32
@@ -860,7 +861,8 @@ static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model,
smb_export = legacy_smb_export;
}
if (smb_export) {
- slirp_smb(s, mon, smb_export, smbsrv);
+ if (slirp_smb(s, mon, smb_export, smbsrv) < 0)
+ return -1;
}
#endif
@@ -953,8 +955,8 @@ void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict)
monitor_printf(mon, "invalid format\n");
}
-static void slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
- int legacy_format)
+static int slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
+ int legacy_format)
{
struct in_addr host_addr = { .s_addr = INADDR_ANY };
struct in_addr guest_addr = { .s_addr = 0 };
@@ -1009,11 +1011,13 @@ static void slirp_hostfwd(SlirpState *s, Monitor *mon, const char *redir_str,
guest_port) < 0) {
config_error(mon, "could not set up host forwarding rule '%s'\n",
redir_str);
+ return -1;
}
- return;
+ return 0;
fail_syntax:
config_error(mon, "invalid host forwarding rule '%s'\n", redir_str);
+ return -1;
}
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict)
@@ -1037,7 +1041,7 @@ void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict)
}
-void net_slirp_redir(const char *redir_str)
+int net_slirp_redir(const char *redir_str)
{
struct slirp_config_str *config;
@@ -1047,10 +1051,10 @@ void net_slirp_redir(const char *redir_str)
config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
config->next = slirp_configs;
slirp_configs = config;
- return;
+ return 0;
}
- slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), NULL, redir_str, 1);
+ return slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), NULL, redir_str, 1);
}
#ifndef _WIN32
@@ -1067,8 +1071,8 @@ static void slirp_smb_cleanup(SlirpState *s)
}
}
-static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
- struct in_addr vserver_addr)
+static int slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
+ struct in_addr vserver_addr)
{
static int instance;
char smb_conf[128];
@@ -1080,7 +1084,7 @@ static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
if (mkdir(s->smb_dir, 0700) < 0) {
config_error(mon, "could not create samba server dir '%s'\n",
s->smb_dir);
- return;
+ return -1;
}
snprintf(smb_conf, sizeof(smb_conf), "%s/%s", s->smb_dir, "smb.conf");
@@ -1089,7 +1093,7 @@ static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
slirp_smb_cleanup(s);
config_error(mon, "could not create samba server "
"configuration file '%s'\n", smb_conf);
- return;
+ return -1;
}
fprintf(f,
"[global]\n"
@@ -1120,23 +1124,26 @@ static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0) {
slirp_smb_cleanup(s);
config_error(mon, "conflicting/invalid smbserver address\n");
+ return -1;
}
+ return 0;
}
/* automatic user mode samba server configuration (legacy interface) */
-void net_slirp_smb(const char *exported_dir)
+int net_slirp_smb(const char *exported_dir)
{
struct in_addr vserver_addr = { .s_addr = 0 };
if (legacy_smb_export) {
fprintf(stderr, "-smb given twice\n");
- exit(1);
+ return -1;
}
legacy_smb_export = exported_dir;
if (!QTAILQ_EMPTY(&slirp_stacks)) {
- slirp_smb(QTAILQ_FIRST(&slirp_stacks), NULL, exported_dir,
- vserver_addr);
+ return slirp_smb(QTAILQ_FIRST(&slirp_stacks), NULL, exported_dir,
+ vserver_addr);
}
+ return 0;
}
#endif /* !defined(_WIN32) */
@@ -1160,8 +1167,8 @@ static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
}
-static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
- int legacy_format)
+static int slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
+ int legacy_format)
{
struct in_addr server = { .s_addr = 0 };
struct GuestFwd *fwd;
@@ -1204,14 +1211,14 @@ static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
config_error(mon, "could not open guest forwarding device '%s'\n",
buf);
qemu_free(fwd);
- return;
+ return -1;
}
if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) {
config_error(mon, "conflicting/invalid host:port in guest forwarding "
"rule '%s'\n", config_str);
qemu_free(fwd);
- return;
+ return -1;
}
fwd->server = server;
fwd->port = port;
@@ -1219,10 +1226,11 @@ static void slirp_guestfwd(SlirpState *s, Monitor *mon, const char *config_str,
qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
NULL, fwd);
- return;
+ return 0;
fail_syntax:
config_error(mon, "invalid guest forwarding rule '%s'\n", config_str);
+ return -1;
}
void do_info_usernet(Monitor *mon)
@@ -1372,7 +1380,7 @@ static void tap_send(void *opaque)
*/
#define TAP_DEFAULT_SNDBUF 1024*1024
-static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
+static int tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
{
int sndbuf = TAP_DEFAULT_SNDBUF;
@@ -1387,14 +1395,18 @@ static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && sndbuf_str) {
config_error(mon, "TUNSETSNDBUF ioctl failed: %s\n",
strerror(errno));
+ return -1;
}
+ return 0;
}
#else
-static void tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
+static int tap_set_sndbuf(TAPState *s, const char *sndbuf_str, Monitor *mon)
{
if (sndbuf_str) {
config_error(mon, "No '-net tap,sndbuf=<nbytes>' support available\n");
+ return -1;
}
+ return 0;
}
#endif /* TUNSETSNDBUF */
@@ -2613,10 +2625,10 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
config->flags = SLIRP_CFG_LEGACY;
config->next = slirp_configs;
slirp_configs = config;
+ ret = 0;
} else {
- slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), mon, p, 1);
+ ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), mon, p, 1);
}
- ret = 0;
} else
#endif
#ifdef _WIN32
@@ -2690,8 +2702,7 @@ int net_client_init(Monitor *mon, const char *device, const char *p)
if (get_param_value(buf, sizeof(buf), "sndbuf", p)) {
sndbuf_str = buf;
}
- tap_set_sndbuf(s, sndbuf_str, mon);
- ret = 0;
+ ret = tap_set_sndbuf(s, sndbuf_str, mon);
} else {
ret = -1;
}
diff --git a/net.h b/net.h
index a36df45acc..a2d5b3c247 100644
--- a/net.h
+++ b/net.h
@@ -138,10 +138,10 @@ extern const char *legacy_bootp_filename;
int net_client_init(Monitor *mon, const char *device, const char *p);
void net_client_uninit(NICInfo *nd);
int net_client_parse(const char *str);
-void net_slirp_smb(const char *exported_dir);
+int net_slirp_smb(const char *exported_dir);
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict);
void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict);
-void net_slirp_redir(const char *redir_str);
+int net_slirp_redir(const char *redir_str);
void net_cleanup(void);
void net_client_check(void);
void net_set_boot_mask(int boot_mask);
diff --git a/vl.c b/vl.c
index 776dd0e577..75b640a6be 100644
--- a/vl.c
+++ b/vl.c
@@ -5098,11 +5098,13 @@ int main(int argc, char **argv, char **envp)
break;
#ifndef _WIN32
case QEMU_OPTION_smb:
- net_slirp_smb(optarg);
+ if (net_slirp_smb(optarg) < 0)
+ exit(1);
break;
#endif
case QEMU_OPTION_redir:
- net_slirp_redir(optarg);
+ if (net_slirp_redir(optarg) < 0)
+ exit(1);
break;
#endif
case QEMU_OPTION_bt:
@@ -5849,7 +5851,8 @@ int main(int argc, char **argv, char **envp)
/* init USB devices */
if (usb_enabled) {
- foreach_device_config(DEV_USB, usb_parse);
+ if (foreach_device_config(DEV_USB, usb_parse) < 0)
+ exit(1);
}
/* init generic devices */