#include <glob.h>
#include <libgen.h>
#include <poll.h>
+#include <dirent.h>
+#include <syslog.h>
#include "include/log.h"
#include "include/list.h"
#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;
int fs;
};
-char *fs_names[] = {
+static char *fs_names[] = {
+ "",
"",
+ "mbr",
+ "ext2",
+ "ext3",
+ "fat",
+ "hfsplus",
"",
- "MBR",
- "EXT2",
- "EXT3",
- "FAT",
- "HFSPLUS",
- "NTFS"
+ "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;
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]);
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)
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)
- return;
+
mount = malloc(sizeof(struct mount));
INIT_LIST_HEAD(&mount->list);
strncpy(mount->vendor, vendor, 64);
mount->mounted = 0;
mount->fs = fs;
list_add(&mount->list, &mounts);
- if((!mount->ignore) && (mount->fs > MBR) && (mount->fs <= NTFS))
+ if (!mount->ignore)
{
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);
+ if (!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];
if(!fp)
{
log_printf("error reading /proc/mounts");
- 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];
return avail;
}
-int mount_wait_for_disc(char *disc)
+static int mount_wait_for_disc(char *disc)
{
int i = 10;
while(i--)
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));
}
pid = waitpid(pid, &ret, 0);
ret = WEXITSTATUS(ret);
log_printf("----------> mount ret = %d\n", ret);
- if(ret && (ret != 0xff))
+ if (ret && ret != 0xff) {
+ rmdir(tmp);
return -1;
+ }
if(mount_wait_for_disc(mount->dev) == 0)
{
mount->mounted = 1;
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];
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)
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)
} 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)
char size[64];
char sector_size[64];
FILE *fp;
+ int offset = 3;
+ int fs;
+
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);
fclose(fp);
}
snprintf(tmp, 64, "/dev/%s", dev);
- mount_add_list(node, dev, s, vendor, model, rev, ignore, size, sector_size, detect_fs(tmp));
+ fs = detect_fs(tmp);
+ if (fs <= MBR || fs > LASTFS) {
+ ignore = 1;
+ }
+ mount_add_list(node, dev, s, vendor, model, rev, ignore, size, sector_size, fs);
mount_dump_uci_state();
}
}
-void mount_dev_del(char *dev)
+static void mount_dev_del(char *dev)
{
struct mount *mount = mount_find(0, dev);
char tmp[256];
return 0;
}
-void mount_check_mount_list(void)
+static void mount_check_mount_list(void)
{
FILE *fp = fopen("/proc/mounts", "r");
char tmp[256];
if(!fp)
{
log_printf("error reading /proc/mounts");
- fclose(fp);
return;
}
mounted_count = 0;
- while(fgets(tmp, 256, fp) > 0)
+ while(fgets(tmp, 256, fp) != NULL)
{
char *t, *t2;
t = strstr(tmp, " ");
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++)
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);
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]);
}
p->next->prev = p->prev;
p = p->next;
log_printf("removing %s\n", q->dev);
- snprintf(tmp, 64, "%s%s", uci_path, q->name);
- unlink(tmp);
- system_printf("/etc/mountd/event remove %s %s", q->dev, q->name);
+ if (q->mounted) {
+ 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("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");
mount_dev_add(block[i]);
}
-void mount_check_enum(void)
+static void mount_check_enum(void)
{
waitpid(-1, 0, WNOHANG);
mount_enum_drives();