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 | 38 | #include <sys/mman.h> |
| 39 | 39 | #include <sys/ioctl.h> |
| 40 | 40 | #include <sys/socket.h> |
| 41 | +#include <dirent.h> | |
| 41 | 42 | #ifdef _BSD |
| 42 | 43 | #include <sys/stat.h> |
| 43 | 44 | #ifndef __APPLE__ |
| ... | ... | @@ -1453,6 +1454,80 @@ static void net_slirp_redir(const char *redir_str) |
| 1453 | 1454 | fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n"); |
| 1454 | 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 | 1532 | #endif /* CONFIG_SLIRP */ |
| 1458 | 1533 | |
| ... | ... | @@ -2407,6 +2482,7 @@ void help(void) |
| 2407 | 2482 | #ifdef CONFIG_SLIRP |
| 2408 | 2483 | "-user-net use user mode network stack [default if no tap/tun script]\n" |
| 2409 | 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 | 2486 | "-redir [tcp|udp]:host-port:[guest-host]:guest-port\n" |
| 2411 | 2487 | " redirect TCP or UDP connections from host to guest [-user-net]\n" |
| 2412 | 2488 | #endif |
| ... | ... | @@ -2484,6 +2560,7 @@ enum { |
| 2484 | 2560 | QEMU_OPTION_tun_fd, |
| 2485 | 2561 | QEMU_OPTION_user_net, |
| 2486 | 2562 | QEMU_OPTION_tftp, |
| 2563 | + QEMU_OPTION_smb, | |
| 2487 | 2564 | QEMU_OPTION_redir, |
| 2488 | 2565 | QEMU_OPTION_dummy_net, |
| 2489 | 2566 | |
| ... | ... | @@ -2538,6 +2615,7 @@ const QEMUOption qemu_options[] = { |
| 2538 | 2615 | #ifdef CONFIG_SLIRP |
| 2539 | 2616 | { "user-net", 0, QEMU_OPTION_user_net }, |
| 2540 | 2617 | { "tftp", HAS_ARG, QEMU_OPTION_tftp }, |
| 2618 | + { "smb", HAS_ARG, QEMU_OPTION_smb }, | |
| 2541 | 2619 | { "redir", HAS_ARG, QEMU_OPTION_redir }, |
| 2542 | 2620 | #endif |
| 2543 | 2621 | { "dummy-net", 0, QEMU_OPTION_dummy_net }, |
| ... | ... | @@ -2834,6 +2912,9 @@ int main(int argc, char **argv) |
| 2834 | 2912 | case QEMU_OPTION_tftp: |
| 2835 | 2913 | tftp_prefix = optarg; |
| 2836 | 2914 | break; |
| 2915 | + case QEMU_OPTION_smb: | |
| 2916 | + net_slirp_smb(optarg); | |
| 2917 | + break; | |
| 2837 | 2918 | case QEMU_OPTION_user_net: |
| 2838 | 2919 | net_if_type = NET_IF_USER; |
| 2839 | 2920 | break; | ... | ... |