aboutsummaryrefslogtreecommitdiff
path: root/util/fusermount.c
diff options
context:
space:
mode:
authorGravatar Miklos Szeredi <miklos@szeredi.hu>2004-11-30 00:00:02 +0000
committerGravatar Miklos Szeredi <miklos@szeredi.hu>2004-11-30 00:00:02 +0000
commit96dfad7555e4cc410caf60408f517154119169da (patch)
tree9e2b38b2bb660620273796a702884b3e62232454 /util/fusermount.c
parent162bcbbff3d531c7d1a630da706a2d0be80f8995 (diff)
merge to 2_0_merge4
Diffstat (limited to 'util/fusermount.c')
-rw-r--r--util/fusermount.c112
1 files changed, 32 insertions, 80 deletions
diff --git a/util/fusermount.c b/util/fusermount.c
index d8490db..ddf8603 100644
--- a/util/fusermount.c
+++ b/util/fusermount.c
@@ -39,9 +39,10 @@
#define FUSE_DEV_OLD "/proc/fs/fuse/dev"
#define FUSE_DEV_NEW "/dev/fuse"
-#define FUSE_SYS_DEV "/sys/class/misc/fuse/dev"
#define FUSE_VERSION_FILE_OLD "/proc/fs/fuse/version"
#define FUSE_VERSION_FILE_NEW "/sys/fs/fuse/version"
+#define FUSE_MAJOR 10
+#define FUSE_MINOR 229
const char *progname;
@@ -520,20 +521,18 @@ static int check_version(const char *dev)
if (strcmp(dev, FUSE_DEV_OLD) == 0)
isold = 1;
- if (isold)
- version_file = FUSE_VERSION_FILE_OLD;
- else
- version_file = FUSE_VERSION_FILE_NEW;
-
+ version_file = FUSE_VERSION_FILE_NEW;
vf = fopen(version_file, "r");
if (vf == NULL) {
- if (isold) {
- fprintf(stderr, "%s: kernel interface too old\n", progname);
- return -1;
- } else
- /* If /sys/fs/fuse/version doesn't exist, just skip
- version checking */
- return 0;
+ version_file = FUSE_VERSION_FILE_OLD;
+ vf = fopen(version_file, "r");
+ if (vf == NULL) {
+ if (isold) {
+ fprintf(stderr, "%s: kernel interface too old\n", progname);
+ return -1;
+ } else
+ return 0;
+ }
}
res = fscanf(vf, "%i.%i", &majorver, &minorver);
fclose(vf);
@@ -628,7 +627,7 @@ static int try_open(const char *dev, char **devp, int silent)
#define FUSE_TMP_DIRNAME "/tmp/.fuse_devXXXXXX"
#define FUSE_TMP_DEVNAME "/fuse"
-static int try_open_new_temp(unsigned devnum, char **devp, int silent)
+static int try_open_new_temp(unsigned devnum, char **devp)
{
int res;
int fd;
@@ -647,68 +646,29 @@ static int try_open_new_temp(unsigned devnum, char **devp, int silent)
rmdir(dirname);
return -1;
}
- fd = try_open(filename, devp, silent);
+ fd = try_open(filename, devp, 0);
unlink(filename);
rmdir(dirname);
return fd;
}
-static int try_open_new(char **devp, int final)
+static int try_open_fuse_device(char **devp)
{
- const char *dev;
- unsigned minor;
- unsigned major;
- int res;
- struct stat stbuf;
- unsigned devnum;
- char buf[256];
- int fd = open(FUSE_SYS_DEV, O_RDONLY);
+ int fd = try_open(FUSE_DEV_NEW, devp, 1);
+ if (fd >= 0)
+ return fd;
+
if (fd == -1) {
- if (!final)
- return -2;
- fd = try_open(FUSE_DEV_NEW, devp, 1);
- if (fd == -2)
- return -2;
- fd = try_open_new_temp(FUSE_MAJOR << 8 | FUSE_MINOR, devp, 1);
- if (fd == -2)
- return -2;
- return try_open(FUSE_DEV_NEW, devp, 0);
- }
-
- res = read(fd, buf, sizeof(buf)-1);
- close(fd);
- if (res == -1) {
- fprintf(stderr, "%s: failed to read from %s: %s\n", progname,
- FUSE_SYS_DEV, strerror(errno));
- return -1;
+ fd = try_open_new_temp(FUSE_MAJOR << 8 | FUSE_MINOR, devp);
+ if (fd != -2)
+ return fd;
}
- buf[res] = '\0';
- if (sscanf(buf, "%u:%u", &major, &minor) != 2) {
- fprintf(stderr, "%s: parse error reading from %s\n", progname,
- FUSE_SYS_DEV);
- return -1;
- }
+ fd = try_open(FUSE_DEV_OLD, devp, 1);
+ if (fd >= 0)
+ return fd;
- devnum = (major << 8) + (minor & 0xff) + ((minor & 0xff00) << 12);
- dev = FUSE_DEV_NEW;
- res = stat(dev, &stbuf);
- if (res == -1) {
- if (major == FUSE_MAJOR && minor == FUSE_MINOR)
- return try_open_new_temp(devnum, devp, 0);
- else {
- fprintf(stderr, "%s: failed to open %s: %s\n", progname,
- dev, strerror(errno));
- return -1;
- }
- }
-
- if ((stbuf.st_mode & S_IFMT) != S_IFCHR || stbuf.st_rdev != devnum) {
- fprintf(stderr, "%s: %s exists but has wrong attributes\n", progname,
- dev);
- return -1;
- }
- return try_open(dev, devp, 0);
+ return -1;
}
static int open_fuse_device(char **devp)
@@ -723,14 +683,10 @@ static int open_fuse_device(char **devp)
int status;
pid_t pid;
- fd = try_open(FUSE_DEV_OLD, devp, 1);
- if (fd != -1)
+ fd = try_open_fuse_device(devp);
+ if (fd >= 0)
return fd;
-
- fd = try_open_new(devp, 0);
- if (fd != -2)
- return fd;
-
+
#ifndef USE_UCLIBC
pid = fork();
#else
@@ -745,14 +701,10 @@ static int open_fuse_device(char **devp)
waitpid(pid, &status, 0);
}
- fd = try_open(FUSE_DEV_OLD, devp, 1);
- if (fd != -1)
+ fd = try_open_fuse_device(devp);
+ if (fd >= 0)
return fd;
-
- fd = try_open_new(devp, 1);
- if (fd != -2)
- return fd;
-
+
fprintf(stderr, "fuse device not found, try 'modprobe fuse' first\n");
return -1;
}