fix
diff --git a/ChangeLog b/ChangeLog
index 16ed905..8d8e1f5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,10 +1,17 @@
+2005-08-03  Miklos Szeredi <miklos@szeredi.hu>
+
+	* fix warnings in fuse.h and fuse_lowlevel.h if -Wshadow compiler
+	option is used (Paul Alfille).
+
 2005-08-02  Miklos Szeredi <miklos@szeredi.hu>
 
 	* highlevel-lib: added mount options "attr_timeout" and
 	"entry_timeout".  These options control the length of time file
 	attributes and entries (names) are cached.  Both default to 1.0
 	second.
-	
+
+	* kernel: correctly handle zero timeout for attributes and entries
+
 2005-08-01  Miklos Szeredi <miklos@szeredi.hu>
 
 	* Added missing symbols to versionscript (Joshua J. Berry)
@@ -27,7 +34,7 @@
 	newly created
 
 	* lib (highlevel): make open method optional
- 
+
 2005-07-28  Miklos Szeredi <miklos@szeredi.hu>
 
 	* kernel: invalidate attributes for read/readdir/readlink
diff --git a/configure.in b/configure.in
index 3055b01..4a5a493 100644
--- a/configure.in
+++ b/configure.in
@@ -13,7 +13,9 @@
 	AC_SUBST(mkdir_p)
 fi
 
-CFLAGS="-Wall -W -g -O2"
+if test -z "$CFLAGS"; then
+	CFLAGS="-Wall -W -g -O2"
+fi
 CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=64 -D_REENTRANT -DFUSE_USE_VERSION=22"
 
 AC_ARG_ENABLE(kernel-module,
diff --git a/example/hello_ll.c b/example/hello_ll.c
index 9f70865..3a6ea09 100644
--- a/example/hello_ll.c
+++ b/example/hello_ll.c
@@ -78,7 +78,7 @@
     struct stat stbuf;
     size_t oldsize = b->size;
     b->size += fuse_dirent_size(strlen(name));
-    b->p = realloc(b->p, b->size);
+    b->p = (char *) realloc(b->p, b->size);
     memset(&stbuf, 0, sizeof(stbuf));
     stbuf.st_ino = ino;
     fuse_add_dirent(b->p + oldsize, name, &stbuf, b->size);
diff --git a/example/null.c b/example/null.c
index d58feab..d9539ab 100644
--- a/example/null.c
+++ b/example/null.c
@@ -12,8 +12,6 @@
 #include <time.h>
 #include <errno.h>
 
-#define UNUSED(x) x __attribute__((unused))
-
 static int null_getattr(const char *path, struct stat *stbuf)
 {
     if(strcmp(path, "/") != 0)
@@ -30,34 +28,46 @@
     return 0;
 }
 
-static int null_truncate(const char *path, off_t UNUSED(size))
+static int null_truncate(const char *path, off_t size)
 {
+    (void) size;
+
     if(strcmp(path, "/") != 0)
         return -ENOENT;
 
     return 0;
 }
 
-static int null_open(const char *path, struct fuse_file_info *UNUSED(fi))
+static int null_open(const char *path, struct fuse_file_info *fi)
 {
+    (void) fi;
+
     if(strcmp(path, "/") != 0)
         return -ENOENT;
 
     return 0;
 }
 
-static int null_read(const char *path, char *UNUSED(buf), size_t size,
-                     off_t UNUSED(offset), struct fuse_file_info *UNUSED(fi))
+static int null_read(const char *path, char *buf, size_t size,
+                     off_t offset, struct fuse_file_info *fi)
 {
+    (void) buf;
+    (void) offset;
+    (void) fi;
+
     if(strcmp(path, "/") != 0)
         return -ENOENT;
 
     return size;
 }
 
-static int null_write(const char *path, const char *UNUSED(buf), size_t size,
-                     off_t UNUSED(offset), struct fuse_file_info *UNUSED(fi))
+static int null_write(const char *path, const char *buf, size_t size,
+                     off_t offset, struct fuse_file_info *fi)
 {
+    (void) buf;
+    (void) offset;
+    (void) fi;
+
     if(strcmp(path, "/") != 0)
         return -ENOENT;
 
diff --git a/include/fuse.h b/include/fuse.h
index db9a417..ade49f5 100644
--- a/include/fuse.h
+++ b/include/fuse.h
@@ -58,7 +58,7 @@
  * @return 1 if buffer is full, zero otherwise
  */
 typedef int (*fuse_fill_dir_t) (void *buf, const char *name,
-                                const struct stat *stat, off_t off);
+                                const struct stat *stbuf, off_t off);
 
 /* Used by deprecated getdir() method */
 typedef struct fuse_dirhandle *fuse_dirh_t;
@@ -148,7 +148,7 @@
      * with the given flags.  In fact it cannot correctly do that
      * since it doesn't have a way to determine if the file was just
      * created (and hence the permission need not be checked).
-     * 
+     *
      * If permission needs to be checked, implement the access()
      * method, and do the check there.
      *
@@ -313,7 +313,7 @@
 
     /**
      * Check file access permissions
-     * 
+     *
      * Need not be implemented.  Will only be called for the access()
      * system call, and for the open() system call, unless a new file
      * is created (file didn't exist and O_CREAT was given).  If the
diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h
index 16257a9..8b18959 100644
--- a/include/fuse_lowlevel.h
+++ b/include/fuse_lowlevel.h
@@ -115,7 +115,7 @@
                      size_t size);
     void (*listxattr)(fuse_req_t req, fuse_ino_t ino, size_t size);
     void (*removexattr)(fuse_req_t req, fuse_ino_t ino, const char *name);
-    void (*getlk)  (fuse_req_t req, fuse_ino_t ino, 
+    void (*getlk)  (fuse_req_t req, fuse_ino_t ino,
                     const struct fuse_lock_param *lk);
     void (*setlk)  (fuse_req_t req, fuse_ino_t ino, int sleep,
                     const struct fuse_lock_param *lk);
@@ -149,7 +149,7 @@
 int fuse_reply_buf(fuse_req_t req, const char *buf, size_t size);
 
 /* statfs */
-int fuse_reply_statfs(fuse_req_t req, const struct statfs *statfs);
+int fuse_reply_statfs(fuse_req_t req, const struct statfs *stbuf);
 
 /* getxattr, listxattr */
 int fuse_reply_xattr(fuse_req_t req, size_t count);
@@ -163,7 +163,7 @@
 size_t fuse_dirent_size(size_t namelen);
 
 /* add a directory entry to the buffer */
-char *fuse_add_dirent(char *buf, const char *name, const struct stat *stat,
+char *fuse_add_dirent(char *buf, const char *name, const struct stat *stbuf,
                       off_t off);
 
 /* ------------------------------------------ */
diff --git a/kernel/dir.c b/kernel/dir.c
index a7a6945..f2fe170 100644
--- a/kernel/dir.c
+++ b/kernel/dir.c
@@ -24,7 +24,7 @@
 					    unsigned long nsec)
 {
 	struct timespec ts = {sec, nsec};
-	return jiffies + timespec_to_jiffies(&ts);
+	return jiffies + ((sec || nsec) ? timespec_to_jiffies(&ts) : 0) - 1;
 }
 
 static void fuse_lookup_init(struct fuse_req *req, struct inode *dir,
@@ -552,7 +552,7 @@
 			return -EACCES;
 
 		err = 0;
-		if (nd && 
+		if (nd &&
 		    ((nd->flags & LOOKUP_ACCESS) ||
 		     ((nd->flags & LOOKUP_OPEN) && mode != 0)))
 			err = fuse_access(inode, mask);
diff --git a/lib/fuse.c b/lib/fuse.c
index b3203d2..68eeee0 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -745,7 +745,7 @@
 static void fuse_readlink(fuse_req_t req, fuse_ino_t ino)
 {
     struct fuse *f = req_fuse_prepare(req);
-    char link[PATH_MAX + 1];
+    char linkname[PATH_MAX + 1];
     char *path;
     int err;
 
@@ -755,13 +755,13 @@
     if (path != NULL) {
         err = -ENOSYS;
         if (f->op.readlink)
-            err = f->op.readlink(path, link, sizeof(link));
+            err = f->op.readlink(path, linkname, sizeof(linkname));
         free(path);
     }
     pthread_rwlock_unlock(&f->tree_lock);
     if (!err) {
-        link[PATH_MAX] = '\0';
-        fuse_reply_readlink(req, link);
+        linkname[PATH_MAX] = '\0';
+        fuse_reply_readlink(req, linkname);
     } else
         reply_err(req, err);
 }
@@ -878,8 +878,8 @@
     reply_err(req, err);
 }
 
-static void fuse_symlink(fuse_req_t req, const char *link, fuse_ino_t parent,
-                         const char *name)
+static void fuse_symlink(fuse_req_t req, const char *linkname,
+                         fuse_ino_t parent, const char *name)
 {
     struct fuse *f = req_fuse_prepare(req);
     struct fuse_entry_param e;
@@ -896,7 +896,7 @@
         }
         err = -ENOSYS;
         if (f->op.symlink && f->op.getattr) {
-            err = f->op.symlink(link, path);
+            err = f->op.symlink(linkname, path);
             if (!err)
                 err = lookup_path(f, parent, name, path, &e);
         }
@@ -1253,7 +1253,7 @@
 }
 
 static int fill_dir_common(struct fuse_dirhandle *dh, const char *name,
-                           const struct stat *stat, off_t off)
+                           const struct stat *statp, off_t off)
 {
     struct stat stbuf;
     unsigned namelen = strlen(name);
@@ -1261,11 +1261,11 @@
     unsigned newlen;
     char *newptr;
 
-    if (stat)
-        stbuf = *stat;
+    if (statp)
+        stbuf = *statp;
     else {
         memset(&stbuf, 0, sizeof(stbuf));
-        stbuf.st_ino = -1;
+        stbuf.st_ino = (ino_t) -1;
     }
 
     if (!(dh->fuse->flags & FUSE_USE_INO)) {
@@ -1289,7 +1289,7 @@
             return 1;
     }
 
-    newptr = realloc(dh->contents, newlen);
+    newptr = (char *) realloc(dh->contents, newlen);
     if (!newptr) {
         dh->error = -ENOMEM;
         return 1;
@@ -1300,10 +1300,10 @@
     return 0;
 }
 
-static int fill_dir(void *buf, const char *name, const struct stat *stat,
+static int fill_dir(void *buf, const char *name, const struct stat *stbuf,
                     off_t off)
 {
-    return fill_dir_common((struct fuse_dirhandle *) buf, name, stat, off);
+    return fill_dir_common((struct fuse_dirhandle *) buf, name, stbuf, off);
 }
 
 static int fill_dir_old(struct fuse_dirhandle *dh, const char *name, int type,
@@ -1431,15 +1431,15 @@
 }
 
 static void convert_statfs_compat(struct fuse_statfs_compat1 *compatbuf,
-                                  struct statfs *statfs)
+                                  struct statfs *stbuf)
 {
-    statfs->f_bsize   = compatbuf->block_size;
-    statfs->f_blocks  = compatbuf->blocks;
-    statfs->f_bfree   = compatbuf->blocks_free;
-    statfs->f_bavail  = compatbuf->blocks_free;
-    statfs->f_files   = compatbuf->files;
-    statfs->f_ffree   = compatbuf->files_free;
-    statfs->f_namelen = compatbuf->namelen;
+    stbuf->f_bsize   = compatbuf->block_size;
+    stbuf->f_blocks  = compatbuf->blocks;
+    stbuf->f_bfree   = compatbuf->blocks_free;
+    stbuf->f_bavail  = compatbuf->blocks_free;
+    stbuf->f_files   = compatbuf->files;
+    stbuf->f_ffree   = compatbuf->files_free;
+    stbuf->f_namelen = compatbuf->namelen;
 }
 
 static void fuse_statfs(fuse_req_t req)
@@ -1870,7 +1870,7 @@
 struct fuse *fuse_new_compat1(int fd, int flags,
                               const struct fuse_operations_compat1 *op)
 {
-    char *opts = NULL;
+    const char *opts = NULL;
     if (flags & FUSE_DEBUG_COMPAT1)
         opts = "debug";
     return fuse_new_common(fd, opts, (struct fuse_operations *) op,
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 9df0e09..fce1d6d 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -225,7 +225,7 @@
     return FUSE_DIRENT_ALIGN(FUSE_NAME_OFFSET + namelen);
 }
 
-char *fuse_add_dirent(char *buf, const char *name, const struct stat *stat,
+char *fuse_add_dirent(char *buf, const char *name, const struct stat *stbuf,
                       off_t off)
 {
     unsigned namelen = strlen(name);
@@ -234,10 +234,10 @@
     unsigned padlen = entsize - entlen;
     struct fuse_dirent *dirent = (struct fuse_dirent *) buf;
 
-    dirent->ino = stat->st_ino;
+    dirent->ino = stbuf->st_ino;
     dirent->off = off;
     dirent->namelen = namelen;
-    dirent->type = (stat->st_mode & 0170000) >> 12;
+    dirent->type = (stbuf->st_mode & 0170000) >> 12;
     strncpy(dirent->name, name, namelen);
     if (padlen)
         memset(buf + entlen, 0, padlen);
@@ -245,16 +245,16 @@
     return buf + entsize;
 }
 
-static void convert_statfs(const struct statfs *statfs,
+static void convert_statfs(const struct statfs *stbuf,
                            struct fuse_kstatfs *kstatfs)
 {
-    kstatfs->bsize	= statfs->f_bsize;
-    kstatfs->blocks	= statfs->f_blocks;
-    kstatfs->bfree	= statfs->f_bfree;
-    kstatfs->bavail	= statfs->f_bavail;
-    kstatfs->files	= statfs->f_files;
-    kstatfs->ffree	= statfs->f_ffree;
-    kstatfs->namelen	= statfs->f_namelen;
+    kstatfs->bsize	= stbuf->f_bsize;
+    kstatfs->blocks	= stbuf->f_blocks;
+    kstatfs->bfree	= stbuf->f_bfree;
+    kstatfs->bavail	= stbuf->f_bavail;
+    kstatfs->files	= stbuf->f_files;
+    kstatfs->ffree	= stbuf->f_ffree;
+    kstatfs->namelen	= stbuf->f_namelen;
 }
 
 static void free_req(fuse_req_t req)
@@ -332,9 +332,9 @@
     return send_reply_req(req, &arg, sizeof(arg));
 }
 
-int fuse_reply_readlink(fuse_req_t req, const char *link)
+int fuse_reply_readlink(fuse_req_t req, const char *linkname)
 {
-    return send_reply_req(req, link, strlen(link));
+    return send_reply_req(req, linkname, strlen(linkname));
 }
 
 int fuse_reply_open(fuse_req_t req, const struct fuse_file_info *f)
@@ -366,12 +366,12 @@
     return send_reply_req(req, buf, size);
 }
 
-int fuse_reply_statfs(fuse_req_t req, const struct statfs *statfs)
+int fuse_reply_statfs(fuse_req_t req, const struct statfs *stbuf)
 {
     struct fuse_statfs_out arg;
 
     memset(&arg, 0, sizeof(arg));
-    convert_statfs(statfs, &arg.st);
+    convert_statfs(stbuf, &arg.st);
 
     return send_reply_req(req, &arg, sizeof(arg));
 }
@@ -389,10 +389,10 @@
 int fuse_reply_getlk(fuse_req_t req, const struct fuse_lock_param *lk)
 {
     struct fuse_lk_in_out arg;
-    
+
     memset(&arg, 0, sizeof(arg));
     convert_lock_param(lk, &arg.lk);
-    
+
     return send_reply_req(req, &arg, sizeof(arg));
 }
 
@@ -482,10 +482,10 @@
 }
 
 static void do_symlink(fuse_req_t req, fuse_ino_t nodeid, char *name,
-                       char *link)
+                       char *linkname)
 {
     if (req->f->op.symlink)
-        req->f->op.symlink(req, link, nodeid, name);
+        req->f->op.symlink(req, linkname, nodeid, name);
     else
         fuse_reply_err(req, ENOSYS);
 }
@@ -706,7 +706,7 @@
 {
     if (req->f->op.getlk) {
         struct fuse_lock_param lk;
-        
+
         memset(&lk, 0, sizeof(lk));
         convert_file_lock(&arg->lk, &lk);
         req->f->op.getlk(req, nodeid, &lk);
@@ -714,15 +714,15 @@
         fuse_reply_err(req, ENOSYS);
 }
 
-static void do_setlk(fuse_req_t req, fuse_ino_t nodeid, int sleep, 
+static void do_setlk(fuse_req_t req, fuse_ino_t nodeid, int issleep,
                      struct fuse_lk_in_out *arg)
 {
     if (req->f->op.setlk) {
         struct fuse_lock_param lk;
-        
+
         memset(&lk, 0, sizeof(lk));
         convert_file_lock(&arg->lk, &lk);
-        req->f->op.setlk(req, nodeid, sleep, &lk);
+        req->f->op.setlk(req, nodeid, issleep, &lk);
     } else
         fuse_reply_err(req, ENOSYS);
 }
@@ -781,7 +781,7 @@
 
     if (f->debug) {
         printf("unique: %llu, opcode: %s (%i), nodeid: %lu, insize: %i\n",
-               in->unique, opname(in->opcode), in->opcode,
+               in->unique, opname((enum fuse_opcode) in->opcode), in->opcode,
                (unsigned long) in->nodeid, cmd->buflen);
         fflush(stdout);
     }
@@ -936,7 +936,7 @@
     case FUSE_SETLKW:
         do_setlk(req, in->nodeid, 1, (struct fuse_lk_in_out *) inarg);
         break;
-        
+
     case FUSE_ACCESS:
         do_access(req, in->nodeid, (struct fuse_access_in *) inarg);
         break;
diff --git a/lib/fuse_lowlevel_mt.c b/lib/fuse_lowlevel_mt.c
index a06d42c..ee3a0ac 100644
--- a/lib/fuse_lowlevel_mt.c
+++ b/lib/fuse_lowlevel_mt.c
@@ -94,7 +94,7 @@
     struct fuse_worker *w;
     int i;
 
-    w = malloc(sizeof(struct fuse_worker));
+    w = (struct fuse_worker *) malloc(sizeof(struct fuse_worker));
     if (w == NULL) {
         fprintf(stderr, "fuse: failed to allocate worker structure\n");
         return -1;
diff --git a/lib/fuse_mt.c b/lib/fuse_mt.c
index bbd0392..8359994 100644
--- a/lib/fuse_mt.c
+++ b/lib/fuse_mt.c
@@ -40,7 +40,7 @@
     free(data);
 }
 
-static int mt_create_context_key()
+static int mt_create_context_key(void)
 {
     int err = 0;
     pthread_mutex_lock(&context_lock);
@@ -58,7 +58,7 @@
     return err;
 }
 
-static void mt_delete_context_key()
+static void mt_delete_context_key(void)
 {
     pthread_mutex_lock(&context_lock);
     context_ref--;
diff --git a/lib/helper.c b/lib/helper.c
index 681197d..a6c472f 100644
--- a/lib/helper.c
+++ b/lib/helper.c
@@ -63,13 +63,14 @@
     fprintf(stderr, "see `%s -h' for usage\n", argv[0]);
 }
 
-static void exit_handler()
+static void exit_handler(int sig)
 {
+    (void) sig;
     if (fuse_instance != NULL)
         fuse_exit(fuse_instance);
 }
 
-static int set_one_signal_handler(int signal, void (*handler)(int))
+static int set_one_signal_handler(int sig, void (*handler)(int))
 {
     struct sigaction sa;
     struct sigaction old_sa;
@@ -79,20 +80,20 @@
     sigemptyset(&(sa.sa_mask));
     sa.sa_flags = 0;
 
-    if (sigaction(signal, NULL, &old_sa) == -1) {
+    if (sigaction(sig, NULL, &old_sa) == -1) {
         perror("FUSE: cannot get old signal handler");
         return -1;
     }
 
     if (old_sa.sa_handler == SIG_DFL &&
-        sigaction(signal, &sa, NULL) == -1) {
+        sigaction(sig, &sa, NULL) == -1) {
         perror("Cannot set signal handler");
         return -1;
     }
     return 0;
 }
 
-static int set_signal_handlers()
+static int set_signal_handlers(void)
 {
     if (set_one_signal_handler(SIGHUP, exit_handler) == -1 ||
         set_one_signal_handler(SIGINT, exit_handler) == -1 ||
@@ -121,13 +122,13 @@
     unsigned len = strlen(opt);
     if (*optp) {
         unsigned oldlen = strlen(*optp);
-        *optp = realloc(*optp, oldlen + 1 + len + 1);
+        *optp = (char *) realloc(*optp, oldlen + 1 + len + 1);
         if (*optp == NULL)
             return -1;
         (*optp)[oldlen] = ',';
         strcpy(*optp + oldlen + 1, opt);
     } else {
-        *optp = malloc(len + 1);
+        *optp = (char *) malloc(len + 1);
         if (*optp == NULL)
             return -1;
         strcpy(*optp, opt);
@@ -197,7 +198,7 @@
     else if (basename[1] != '\0')
         basename++;
 
-    fsname_opt = malloc(strlen(basename) + 64);
+    fsname_opt = (char *) malloc(strlen(basename) + 64);
     if (fsname_opt == NULL) {
         fprintf(stderr, "fuse: memory allocation failed\n");
         return -1;
@@ -419,7 +420,7 @@
 }
 
 #undef fuse_main
-int fuse_main()
+int fuse_main(void)
 {
     fprintf(stderr, "fuse_main(): This function does not exist\n");
     return -1;
diff --git a/lib/mount.c b/lib/mount.c
index 01081bb..3236ce8 100644
--- a/lib/mount.c
+++ b/lib/mount.c
@@ -108,7 +108,7 @@
         char env[10];
         const char *argv[32];
         int a = 0;
-        
+
         argv[a++] = mountprog;
         if (opts) {
             argv[a++] = "-o";
diff --git a/util/fusermount.c b/util/fusermount.c
index 9c7bbf3..21504d4 100644
--- a/util/fusermount.c
+++ b/util/fusermount.c
@@ -51,7 +51,7 @@
 static int user_allow_other = 0;
 static int mount_max = 1000;
 
-static const char *get_user_name()
+static const char *get_user_name(void)
 {
     struct passwd *pw = getpwuid(getuid());
     if (pw != NULL && pw->pw_name != NULL)
@@ -95,7 +95,7 @@
 #ifndef USE_UCLIBC
 /* use a lock file so that multiple fusermount processes don't try and
    modify the mtab file at once! */
-static int lock_mtab()
+static int lock_mtab(void)
 {
     const char *mtab_lock = _PATH_MOUNTED ".fuselock";
     int mtablock;
@@ -184,18 +184,18 @@
 
     found = 0;
     while ((entp = getmntent(fp)) != NULL) {
-        int remove = 0;
+        int removed = 0;
         if (!found && strcmp(entp->mnt_dir, mnt) == 0 &&
            strcmp(entp->mnt_type, "fuse") == 0) {
             if (user == NULL)
-                remove = 1;
+                removed = 1;
             else {
                 char *p = strstr(entp->mnt_opts, "user=");
                 if (p != NULL && strcmp(p + 5, user) == 0)
-                    remove = 1;
+                    removed = 1;
             }
         }
-        if (remove)
+        if (removed)
             found = 1;
         else {
             res = addmntent(newfp, entp);
@@ -220,7 +220,7 @@
     return 0;
 }
 
-static int count_fuse_fs()
+static int count_fuse_fs(void)
 {
     struct mntent *entp;
     int count = 0;
@@ -424,7 +424,7 @@
     else {
         unsigned oldsize = strlen(*optsp);
         unsigned newsize = oldsize + 1 + strlen(opt) + expand + 1;
-        newopts = realloc(*optsp, newsize);
+        newopts = (char *) realloc(*optsp, newsize);
         if (newopts)
             sprintf(newopts + oldsize, ",%s", opt);
     }
@@ -521,7 +521,7 @@
     char *fsname = NULL;
     int check_empty = 1;
 
-    optbuf = malloc(strlen(opts) + 128);
+    optbuf = (char *) malloc(strlen(opts) + 128);
     if (!optbuf) {
         fprintf(stderr, "%s: failed to allocate memory\n", progname);
         return -1;
@@ -535,7 +535,7 @@
             unsigned fsname_str_len = strlen(fsname_str);
             if (fsname)
                 free(fsname);
-            fsname = malloc(len - fsname_str_len + 1);
+            fsname = (char *) malloc(len - fsname_str_len + 1);
             if (!fsname) {
                 fprintf(stderr, "%s: failed to allocate memory\n", progname);
                 goto err;