X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=mount.c;h=a7f1862f2747919090da85c2c4fcc140ae282463;hb=dd5799c9f8cc7a01c0572c067bf907b37cdd7d04;hp=16c35299cb8806586ffd9b85a54102f25d58bcea;hpb=be3b285c88648c24f7e4b36bebac56a95fa80f7e;p=project%2Fmountd.git diff --git a/mount.c b/mount.c index 16c3529..a7f1862 100644 --- a/mount.c +++ b/mount.c @@ -16,6 +16,8 @@ #include #include #include +#include +#include #include "include/log.h" #include "include/list.h" @@ -25,10 +27,11 @@ #include "include/autofs.h" #include "include/ucix.h" #include "include/fs.h" +#include "include/mount.h" int mount_new(char *path, char *dev); -struct list_head mounts; +static struct list_head mounts; struct mount { struct list_head list; @@ -45,25 +48,30 @@ struct mount { int fs; }; -char *fs_names[] = { +static char *fs_names[] = { + "", + "", + "mbr", + "ext2", + "ext3", + "fat", + "hfsplus", "", + "ntfs", "", - "MBR", - "EXT2", - "EXT3", - "FAT", - "HFSPLUS", - "NTFS" + "exfat", + "ext4", + "hfsplusjournal" }; #define MAX_MOUNTED 32 #define MAX_MOUNT_NAME 32 -char mounted[MAX_MOUNTED][3][MAX_MOUNT_NAME]; -int mounted_count = 0; +static char mounted[MAX_MOUNTED][3][MAX_MOUNT_NAME]; +static int mounted_count = 0; extern char uci_path[32]; -void mount_dump_uci_state(void) +static void mount_dump_uci_state(void) { struct uci_context *ctx; struct list_head *p; @@ -93,7 +101,7 @@ void mount_dump_uci_state(void) ucix_add_option(ctx, mountd, q->serial, "rev", q->rev); snprintf(t, 64, "size%d", atoi(&q->dev[3])); ucix_add_option(ctx, mountd, q->serial, t, q->size); - if(q->fs > MBR && q->fs <= NTFS) + if(q->fs > MBR && q->fs <= LASTFS) { snprintf(t, 64, "fs%d", atoi(&q->dev[3])); ucix_add_option(ctx, mountd, q->serial, t, fs_names[q->fs]); @@ -110,7 +118,7 @@ void mount_dump_uci_state(void) ucix_cleanup(ctx); } -struct mount* mount_find(char *name, char *dev) +static struct mount* mount_find(char *name, char *dev) { struct list_head *p; list_for_each(p, &mounts) @@ -126,12 +134,12 @@ struct mount* mount_find(char *name, char *dev) return 0; } -void mount_add_list(char *name, char *dev, char *serial, +static void mount_add_list(char *name, char *dev, char *serial, char *vendor, char *model, char *rev, int ignore, char *size, char *sector_size, int fs) { struct mount *mount; char tmp[64], tmp2[64]; - if(fs <= MBR || fs > NTFS) + if(fs <= MBR || fs > LASTFS) return; mount = malloc(sizeof(struct mount)); INIT_LIST_HEAD(&mount->list); @@ -147,17 +155,18 @@ void mount_add_list(char *name, char *dev, char *serial, mount->mounted = 0; mount->fs = fs; list_add(&mount->list, &mounts); - if((!mount->ignore) && (mount->fs > MBR) && (mount->fs <= NTFS)) + if((!mount->ignore) && (mount->fs > MBR) && (mount->fs <= LASTFS)) { log_printf("new mount : %s -> %s (%s)\n", name, dev, fs_names[mount->fs]); snprintf(tmp, 64, "%s%s", uci_path, name); snprintf(tmp2, 64, "/tmp/run/mountd/%s", dev); symlink(tmp2, tmp); mount_new("/tmp/run/mountd/", dev); + system_printf("ACTION=add DEVICE=%s NAME=%s /sbin/hotplug-call mount", dev, name); } } -int mount_check_disc(char *disc) +static int mount_check_disc(char *disc) { FILE *fp = fopen("/proc/mounts", "r"); char tmp[256]; @@ -168,7 +177,7 @@ int mount_check_disc(char *disc) fclose(fp); return avail; } - while((fgets(tmp, 256, fp) > 0) && (avail == -1)) + while((fgets(tmp, 256, fp) != NULL) && (avail == -1)) { char *t; char tmp2[32]; @@ -187,7 +196,7 @@ int mount_check_disc(char *disc) return avail; } -int mount_wait_for_disc(char *disc) +static int mount_wait_for_disc(char *disc) { int i = 10; while(i--) @@ -221,30 +230,64 @@ int mount_new(char *path, char *dev) pid = autofs_safe_fork(); if(!pid) { + char *options, *fstype; + if(mount->fs == EXFAT) + { + options = "rw,uid=1000,gid=1000"; + fstype = "exfat"; + } if(mount->fs == FAT) { - log_printf("mount -t vfat -o rw,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t vfat -o rw,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); + options = "rw,uid=1000,gid=1000"; + fstype = "vfat"; + } + if(mount->fs == EXT4) + { + options = "rw,defaults"; + fstype = "ext4"; } if(mount->fs == EXT3) { - log_printf("mount -t ext3 -o rw,defaults /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t ext3 -o rw,defaults /dev/%s %s", mount->dev, tmp); + options = "rw,defaults"; + fstype = "ext3"; } if(mount->fs == EXT2) { - log_printf("mount -t ext2 -o rw,defaults /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t ext2 -o rw,defaults /dev/%s %s", mount->dev, tmp); + options = "rw,defaults"; + fstype = "ext2"; } if(mount->fs == HFSPLUS) { - log_printf("mount -t hfsplus -o rw,defaults,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); - ret = system_printf("mount -t hfsplus -o rw,defaults,uid=1000,gid=1000 /dev/%s %s", mount->dev, tmp); + options = "rw,defaults,uid=1000,gid=1000"; + fstype = "hfsplus"; + } + if(mount->fs == HFSPLUSJOURNAL) + { + options = "ro,defaults,uid=1000,gid=1000"; + fstype = "hfsplus"; } if(mount->fs == NTFS) { - log_printf("ntfs-3g /dev/%s %s -o force", mount->dev, tmp); - ret = system_printf("ntfs-3g /dev/%s %s -o force", mount->dev, tmp); + options = "force"; + fstype = "ntfs-3g"; + } + if(mount->fs > MBR && mount->fs <= LASTFS) + { + struct uci_context *ctx; + char *uci_options, *uci_fstype; + ctx = ucix_init("mountd"); + if(fs_names[mount->fs]) + { + uci_options = ucix_get_option(ctx, "mountd", fs_names[mount->fs], "options"); + uci_fstype = ucix_get_option(ctx, "mountd", fs_names[mount->fs], "fstype"); + if(uci_options) + options = uci_options; + if(uci_fstype) + fstype = uci_fstype; + log_printf("mount -t %s -o %s /dev/%s %s", fstype, options, mount->dev, tmp); + ret = system_printf("mount -t %s -o %s /dev/%s %s", fstype, options, mount->dev, tmp); + } + ucix_cleanup(ctx); } exit(WEXITSTATUS(ret)); } @@ -280,19 +323,19 @@ int mount_remove(char *path, char *dev) return 0; } -int dir_sort(const void *a, const void *b) +static int dir_sort(const struct dirent **a, const struct dirent **b) { return 0; } -int dir_filter(const struct dirent *a) +static int dir_filter(const struct dirent *a) { if(strstr(a->d_name, ":")) return 1; return 0; } -char* mount_get_serial(char *dev) +static char* mount_get_serial(char *dev) { static char tmp[64]; static char tmp2[64]; @@ -300,6 +343,7 @@ char* mount_get_serial(char *dev) static struct hd_driveid hd; int i; static char *serial; + static char disc_id[13]; snprintf(tmp, 64, "/dev/%s", dev); disc = open(tmp, O_RDONLY); if(!disc) @@ -345,7 +389,7 @@ char* mount_get_serial(char *dev) fp = fopen(tmp2, "r"); if(fp) { - while(fgets(tmp2, 64, fp) > 0) + while(fgets(tmp2, 64, fp) != NULL) { serial = strstr(tmp2, "Serial Number:"); if(serial) @@ -371,23 +415,24 @@ char* mount_get_serial(char *dev) } else { /* serial string id is cheap, but makes the discs anonymous */ unsigned char uniq[6]; + unsigned int *u = (unsigned int*) uniq; int l = strlen(serial); int i; - static char disc_id[13]; memset(disc_id, 0, 13); memset(uniq, 0, 6); for(i = 0; i < l; i++) { uniq[i%6] += serial[i]; } - sprintf(disc_id, "%08X%02X%02X", *((unsigned int*)&uniq[0]), uniq[4], uniq[5]); + sprintf(disc_id, "%08X%02X%02X", *u, uniq[4], uniq[5]); //log_printf("Serial number - %s %s\n", serial, disc_id); return disc_id; } - return 0; + sprintf(disc_id, "000000000000"); + return disc_id; } -void mount_dev_add(char *dev) +static void mount_dev_add(char *dev) { struct mount *mount = mount_find(0, dev); if(!mount) @@ -406,17 +451,28 @@ void mount_dev_add(char *dev) char size[64]; char sector_size[64]; FILE *fp; + int offset = 3; + strcpy(name, dev); - name[3] = '\0'; + if (!strncmp(name, "mmcblk", 6)) + offset = 7; + name[offset] = '\0'; s = mount_get_serial(name); - if(!s) + if(!s) { return; - snprintf(tmp, 64, "part%s", &dev[3]); - snprintf(node, 64, "Disc-%s", &dev[2]); - if(node[5] >= 'a' && node[5] <= 'z') + } + if (!strncmp(name, "mmcblk", 6)) { + snprintf(tmp, 64, "part%s", &dev[8]); + snprintf(node, 64, "SD-P%s", &dev[8]); + + } else { + snprintf(tmp, 64, "part%s", &dev[3]); + snprintf(node, 64, "USB-%s", &dev[2]); + } + if(node[4] >= 'a' && node[4] <= 'z') { - node[5] -= 'a'; - node[5] += 'A'; + node[4] -= 'a'; + node[4] += 'A'; } ctx = ucix_init("mountd"); p = ucix_get_option(ctx, "mountd", s, tmp); @@ -506,7 +562,7 @@ void mount_dev_add(char *dev) } } -void mount_dev_del(char *dev) +static void mount_dev_del(char *dev) { struct mount *mount = mount_find(0, dev); char tmp[256]; @@ -551,7 +607,7 @@ char* is_mounted(char *block, char *path) return 0; } -void mount_check_mount_list(void) +static void mount_check_mount_list(void) { FILE *fp = fopen("/proc/mounts", "r"); char tmp[256]; @@ -563,7 +619,7 @@ void mount_check_mount_list(void) return; } mounted_count = 0; - while(fgets(tmp, 256, fp) > 0) + while(fgets(tmp, 256, fp) != NULL) { char *t, *t2; t = strstr(tmp, " "); @@ -599,18 +655,18 @@ void mount_check_mount_list(void) fclose(fp); } -/* FIXME: we need ore intelligence here */ -int dir_filter2(const struct dirent *a) +/* FIXME: we need more intelligence here */ +static int dir_filter2(const struct dirent *a) { - if(/*strcmp(a->d_name, "sda") &&*/(!strncmp(a->d_name, "sd", 2))) + if(!strncmp(a->d_name, "mmcblk", 6) || !strncmp(a->d_name, "sd", 2)) return 1; return 0; } #define MAX_BLOCK 64 -char block[MAX_BLOCK][MAX_BLOCK]; -int blk_cnt = 0; +static char block[MAX_BLOCK][MAX_BLOCK]; +static int blk_cnt = 0; -int check_block(char *b) +static int check_block(char *b) { int i; for(i = 0; i < blk_cnt; i++) @@ -621,7 +677,7 @@ int check_block(char *b) return 0; } -void mount_enum_drives(void) +static void mount_enum_drives(void) { struct dirent **namelist, **namelist2; int i, n = scandir("/sys/block/", &namelist, dir_filter2, dir_sort); @@ -637,13 +693,19 @@ void mount_enum_drives(void) char tmp[64]; snprintf(tmp, 64, "/sys/block/%s/", namelist[n]->d_name); m = scandir(tmp, &namelist2, dir_filter2, dir_sort); - while(m--) + if(m > 0) { - strncpy(&block[blk_cnt][0], namelist2[m]->d_name, MAX_BLOCK); + while(m--) + { + strncpy(&block[blk_cnt][0], namelist2[m]->d_name, MAX_BLOCK); + blk_cnt++; + free(namelist2[m]); + } + free(namelist2); + } else { + strncpy(&block[blk_cnt][0], namelist[n]->d_name, MAX_BLOCK); blk_cnt++; - free(namelist2[m]); } - free(namelist2); } free(namelist[n]); } @@ -683,9 +745,11 @@ void mount_enum_drives(void) p->next->prev = p->prev; p = p->next; log_printf("removing %s\n", q->dev); + snprintf(tmp, 64, "%s%s", "/tmp/run/mountd/", q->dev); + rmdir(tmp); snprintf(tmp, 64, "%s%s", uci_path, q->name); unlink(tmp); - system_printf("/etc/mountd/event remove %s %s", q->dev, q->name); + system_printf("ACTION=remove DEVICE=%s NAME=%s /sbin/hotplug-call mount", q->dev, q->name); free(q); mount_dump_uci_state(); system_printf("/etc/fonstated/ReloadSamba"); @@ -696,7 +760,7 @@ void mount_enum_drives(void) mount_dev_add(block[i]); } -void mount_check_enum(void) +static void mount_check_enum(void) { waitpid(-1, 0, WNOHANG); mount_enum_drives();