Commit 9d728e8c4ed000b1d6a77230d11b3761a7c8b5a1
1 parent
36d54d15
smb support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1059 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
81 additions
and
0 deletions
vl.c
| @@ -38,6 +38,7 @@ | @@ -38,6 +38,7 @@ | ||
| 38 | #include <sys/mman.h> | 38 | #include <sys/mman.h> |
| 39 | #include <sys/ioctl.h> | 39 | #include <sys/ioctl.h> |
| 40 | #include <sys/socket.h> | 40 | #include <sys/socket.h> |
| 41 | +#include <dirent.h> | ||
| 41 | #ifdef _BSD | 42 | #ifdef _BSD |
| 42 | #include <sys/stat.h> | 43 | #include <sys/stat.h> |
| 43 | #ifndef __APPLE__ | 44 | #ifndef __APPLE__ |
| @@ -1453,6 +1454,80 @@ static void net_slirp_redir(const char *redir_str) | @@ -1453,6 +1454,80 @@ static void net_slirp_redir(const char *redir_str) | ||
| 1453 | fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n"); | 1454 | fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n"); |
| 1454 | exit(1); | 1455 | exit(1); |
| 1455 | } | 1456 | } |
| 1457 | + | ||
| 1458 | +char smb_dir[1024]; | ||
| 1459 | + | ||
| 1460 | +static void smb_exit(void) | ||
| 1461 | +{ | ||
| 1462 | + DIR *d; | ||
| 1463 | + struct dirent *de; | ||
| 1464 | + char filename[1024]; | ||
| 1465 | + | ||
| 1466 | + /* erase all the files in the directory */ | ||
| 1467 | + d = opendir(smb_dir); | ||
| 1468 | + for(;;) { | ||
| 1469 | + de = readdir(d); | ||
| 1470 | + if (!de) | ||
| 1471 | + break; | ||
| 1472 | + if (strcmp(de->d_name, ".") != 0 && | ||
| 1473 | + strcmp(de->d_name, "..") != 0) { | ||
| 1474 | + snprintf(filename, sizeof(filename), "%s/%s", | ||
| 1475 | + smb_dir, de->d_name); | ||
| 1476 | + unlink(filename); | ||
| 1477 | + } | ||
| 1478 | + } | ||
| 1479 | + rmdir(smb_dir); | ||
| 1480 | +} | ||
| 1481 | + | ||
| 1482 | +/* automatic user mode samba server configuration */ | ||
| 1483 | +void net_slirp_smb(const char *exported_dir) | ||
| 1484 | +{ | ||
| 1485 | + char smb_conf[1024]; | ||
| 1486 | + char smb_cmdline[1024]; | ||
| 1487 | + FILE *f; | ||
| 1488 | + | ||
| 1489 | + if (!slirp_inited) { | ||
| 1490 | + slirp_inited = 1; | ||
| 1491 | + slirp_init(); | ||
| 1492 | + } | ||
| 1493 | + | ||
| 1494 | + /* XXX: better tmp dir construction */ | ||
| 1495 | + snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid()); | ||
| 1496 | + if (mkdir(smb_dir, 0700) < 0) { | ||
| 1497 | + fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir); | ||
| 1498 | + exit(1); | ||
| 1499 | + } | ||
| 1500 | + snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf"); | ||
| 1501 | + | ||
| 1502 | + f = fopen(smb_conf, "w"); | ||
| 1503 | + if (!f) { | ||
| 1504 | + fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf); | ||
| 1505 | + exit(1); | ||
| 1506 | + } | ||
| 1507 | + fprintf(f, | ||
| 1508 | + "[global]\n" | ||
| 1509 | + "pid directory=%s\n" | ||
| 1510 | + "lock directory=%s\n" | ||
| 1511 | + "log file=%s/log.smbd\n" | ||
| 1512 | + "smb passwd file=%s/smbpasswd\n" | ||
| 1513 | + "[qemu]\n" | ||
| 1514 | + "path=%s\n" | ||
| 1515 | + "read only=no\n" | ||
| 1516 | + "guest ok=yes\n", | ||
| 1517 | + smb_dir, | ||
| 1518 | + smb_dir, | ||
| 1519 | + smb_dir, | ||
| 1520 | + smb_dir, | ||
| 1521 | + exported_dir | ||
| 1522 | + ); | ||
| 1523 | + fclose(f); | ||
| 1524 | + atexit(smb_exit); | ||
| 1525 | + | ||
| 1526 | + snprintf(smb_cmdline, sizeof(smb_cmdline), "/usr/sbin/smbd -s %s", | ||
| 1527 | + smb_conf); | ||
| 1528 | + | ||
| 1529 | + slirp_add_exec(0, smb_cmdline, 4, 139); | ||
| 1530 | +} | ||
| 1456 | 1531 | ||
| 1457 | #endif /* CONFIG_SLIRP */ | 1532 | #endif /* CONFIG_SLIRP */ |
| 1458 | 1533 | ||
| @@ -2407,6 +2482,7 @@ void help(void) | @@ -2407,6 +2482,7 @@ void help(void) | ||
| 2407 | #ifdef CONFIG_SLIRP | 2482 | #ifdef CONFIG_SLIRP |
| 2408 | "-user-net use user mode network stack [default if no tap/tun script]\n" | 2483 | "-user-net use user mode network stack [default if no tap/tun script]\n" |
| 2409 | "-tftp prefix allow tftp access to files starting with prefix [-user-net]\n" | 2484 | "-tftp prefix allow tftp access to files starting with prefix [-user-net]\n" |
| 2485 | + "-smb dir allow SMB access to files in 'dir' [-user-net]\n" | ||
| 2410 | "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n" | 2486 | "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n" |
| 2411 | " redirect TCP or UDP connections from host to guest [-user-net]\n" | 2487 | " redirect TCP or UDP connections from host to guest [-user-net]\n" |
| 2412 | #endif | 2488 | #endif |
| @@ -2484,6 +2560,7 @@ enum { | @@ -2484,6 +2560,7 @@ enum { | ||
| 2484 | QEMU_OPTION_tun_fd, | 2560 | QEMU_OPTION_tun_fd, |
| 2485 | QEMU_OPTION_user_net, | 2561 | QEMU_OPTION_user_net, |
| 2486 | QEMU_OPTION_tftp, | 2562 | QEMU_OPTION_tftp, |
| 2563 | + QEMU_OPTION_smb, | ||
| 2487 | QEMU_OPTION_redir, | 2564 | QEMU_OPTION_redir, |
| 2488 | QEMU_OPTION_dummy_net, | 2565 | QEMU_OPTION_dummy_net, |
| 2489 | 2566 | ||
| @@ -2538,6 +2615,7 @@ const QEMUOption qemu_options[] = { | @@ -2538,6 +2615,7 @@ const QEMUOption qemu_options[] = { | ||
| 2538 | #ifdef CONFIG_SLIRP | 2615 | #ifdef CONFIG_SLIRP |
| 2539 | { "user-net", 0, QEMU_OPTION_user_net }, | 2616 | { "user-net", 0, QEMU_OPTION_user_net }, |
| 2540 | { "tftp", HAS_ARG, QEMU_OPTION_tftp }, | 2617 | { "tftp", HAS_ARG, QEMU_OPTION_tftp }, |
| 2618 | + { "smb", HAS_ARG, QEMU_OPTION_smb }, | ||
| 2541 | { "redir", HAS_ARG, QEMU_OPTION_redir }, | 2619 | { "redir", HAS_ARG, QEMU_OPTION_redir }, |
| 2542 | #endif | 2620 | #endif |
| 2543 | { "dummy-net", 0, QEMU_OPTION_dummy_net }, | 2621 | { "dummy-net", 0, QEMU_OPTION_dummy_net }, |
| @@ -2834,6 +2912,9 @@ int main(int argc, char **argv) | @@ -2834,6 +2912,9 @@ int main(int argc, char **argv) | ||
| 2834 | case QEMU_OPTION_tftp: | 2912 | case QEMU_OPTION_tftp: |
| 2835 | tftp_prefix = optarg; | 2913 | tftp_prefix = optarg; |
| 2836 | break; | 2914 | break; |
| 2915 | + case QEMU_OPTION_smb: | ||
| 2916 | + net_slirp_smb(optarg); | ||
| 2917 | + break; | ||
| 2837 | case QEMU_OPTION_user_net: | 2918 | case QEMU_OPTION_user_net: |
| 2838 | net_if_type = NET_IF_USER; | 2919 | net_if_type = NET_IF_USER; |
| 2839 | break; | 2920 | break; |