[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 38/41] slirp: Enable multi-instance support for the
From: |
Jan Kiszka |
Subject: |
[Qemu-devel] [PATCH 38/41] slirp: Enable multi-instance support for the smb service |
Date: |
Wed, 24 Jun 2009 14:42:31 +0200 |
User-agent: |
StGIT/0.14.3 |
Push the smb state, smb_dir, into SlirpState and construct it in a way
that allows multiple smb instances (one per slirp stack). Remove the smb
directory on slirp cleanup instead of qemu termination. As VLAN clients
are also cleaned up on process termination, no feature is lost.
Signed-off-by: Jan Kiszka <address@hidden>
---
net.c | 50 ++++++++++++++++++++++++++++++--------------------
1 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/net.c b/net.c
index 22b7080..917f72f 100644
--- a/net.c
+++ b/net.c
@@ -681,6 +681,9 @@ typedef struct SlirpState {
TAILQ_ENTRY(SlirpState) entry;
VLANClientState *vc;
Slirp *slirp;
+#ifndef _WIN32
+ char smb_dir[128];
+#endif
} SlirpState;
static struct slirp_config_str *slirp_configs;
@@ -699,6 +702,9 @@ static const char *legacy_smb_export;
static void 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) { }
#endif
int slirp_can_output(void *opaque)
@@ -736,6 +742,7 @@ static void net_slirp_cleanup(VLANClientState *vc)
SlirpState *s = vc->opaque;
slirp_cleanup(s->slirp);
+ slirp_smb_cleanup(s);
TAILQ_REMOVE(&slirp_stacks, s, entry);
qemu_free(s);
}
@@ -1012,35 +1019,38 @@ void net_slirp_redir(const char *redir_str)
#ifndef _WIN32
-static char smb_dir[1024];
-
/* automatic user mode samba server configuration */
-static void smb_exit(void)
+static void slirp_smb_cleanup(SlirpState *s)
{
- char cmd[1024];
+ char cmd[128];
- snprintf(cmd, sizeof(cmd), "rm -rf %s", smb_dir);
- system(cmd);
+ if (s->smb_dir[0] != '\0') {
+ snprintf(cmd, sizeof(cmd), "rm -rf %s", s->smb_dir);
+ system(cmd);
+ s->smb_dir[0] = '\0';
+ }
}
static void slirp_smb(SlirpState* s, Monitor *mon, const char *exported_dir,
struct in_addr vserver_addr)
{
- char smb_conf[1024];
- char smb_cmdline[1024];
+ static int instance;
+ char smb_conf[128];
+ char smb_cmdline[128];
FILE *f;
- /* XXX: better tmp dir construction */
- snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%ld", (long)getpid());
- if (mkdir(smb_dir, 0700) < 0) {
- config_error(mon, "could not create samba server dir '%s'\n", smb_dir);
+ snprintf(s->smb_dir, sizeof(s->smb_dir), "/tmp/qemu-smb.%ld-%d",
+ (long)getpid(), instance++);
+ if (mkdir(s->smb_dir, 0700) < 0) {
+ config_error(mon, "could not create samba server dir '%s'\n",
+ s->smb_dir);
return;
}
- snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
+ snprintf(smb_conf, sizeof(smb_conf), "%s/%s", s->smb_dir, "smb.conf");
f = fopen(smb_conf, "w");
if (!f) {
- smb_exit();
+ slirp_smb_cleanup(s);
config_error(mon, "could not create samba server "
"configuration file '%s'\n", smb_conf);
return;
@@ -1059,20 +1069,20 @@ static void slirp_smb(SlirpState* s, Monitor *mon,
const char *exported_dir,
"path=%s\n"
"read only=no\n"
"guest ok=yes\n",
- smb_dir,
- smb_dir,
- smb_dir,
- smb_dir,
- smb_dir,
+ s->smb_dir,
+ s->smb_dir,
+ s->smb_dir,
+ s->smb_dir,
+ s->smb_dir,
exported_dir
);
fclose(f);
- atexit(smb_exit);
snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
SMBD_COMMAND, smb_conf);
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");
}
}
- [Qemu-devel] [PATCH 36/41] slirp: Use shell to erase smb directory, (continued)
- [Qemu-devel] [PATCH 36/41] slirp: Use shell to erase smb directory, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 35/41] slirp: Save/restore bootp client states, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 32/41] slirp: Use internal state in interface, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 33/41] slirp: Allocate/free stack instance dynamically, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 31/41] slirp: Factor out internal state structure, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 34/41] slirp: Enable multiple instances, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 41/41] slirp: Basic VLAN client info_str, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 39/41] net: Provide VLAN client lookup helper, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 40/41] slirp: Make hostfwd_add/remove multi-instance-aware, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 37/41] slirp: Improve error handling in slirp_smb, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 38/41] slirp: Enable multi-instance support for the smb service,
Jan Kiszka <=
- [Qemu-devel] Re: [PATCH 00/41] Slirp Fixes and Enhancements - Reloaded, Anthony Liguori, 2009/06/24
- [Qemu-devel] [PATCH 30/41] slirp: Drop link_up checks from if_output and slirp_socket_can_recv, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 22/41] slirp: tftp: Refactor tftp_handle_rrq, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 05/41] slirp: Move smb, redir, tftp and bootp parameters and -net channel, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 16/41] slirp: Drop dead code, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 14/41] slirp: Mark sockets of incoming TCP connections, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 04/41] Introduce get_next_param_value, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 18/41] slirp: Cleanup and basic reanimation of debug code, Jan Kiszka, 2009/06/24
- [Qemu-devel] [PATCH 06/41] slirp: Rework internal configuration, Jan Kiszka, 2009/06/24