/[fuse.before_github]/perl-llin/Fuse.xs
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /perl-llin/Fuse.xs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 71 by dpavlin, Tue Jan 3 17:27:32 2006 UTC revision 92 by dpavlin, Mon May 29 08:57:50 2006 UTC
# Line 27  static inline void create_perl_context() Line 27  static inline void create_perl_context()
27  # define FUSE_CONTEXT_PRE  # define FUSE_CONTEXT_PRE
28  # define FUSE_CONTEXT_POST  # define FUSE_CONTEXT_POST
29  #endif  #endif
30  #include <fuse/fuse.h>  #include <fuse.h>
31    
32  #undef DEBUGf  #undef DEBUGf
33  #if 0  #if 0
# Line 40  static inline void create_perl_context() Line 40  static inline void create_perl_context()
40  SV *_PLfuse_callbacks[N_CALLBACKS];  SV *_PLfuse_callbacks[N_CALLBACKS];
41    
42  int _PLfuse_getattr(const char *file, struct stat *result) {  int _PLfuse_getattr(const char *file, struct stat *result) {
43          int rv, statcount;          int rv;
44          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
45          dSP;          dSP;
46          DEBUGf("getattr begin: %s\n",file);          DEBUGf("getattr begin: %s\n",file);
# Line 71  int _PLfuse_getattr(const char *file, st Line 71  int _PLfuse_getattr(const char *file, st
71                  result->st_uid = POPi;                  result->st_uid = POPi;
72                  result->st_nlink = POPi;                  result->st_nlink = POPi;
73                  result->st_mode = POPi;                  result->st_mode = POPi;
74                  /*result->st_ino =*/ POPi;                  result->st_ino   = POPi;
75                  result->st_dev = POPi;                  result->st_dev = POPi;
76                  rv = 0;                  rv = 0;
77          }          }
# Line 85  int _PLfuse_getattr(const char *file, st Line 85  int _PLfuse_getattr(const char *file, st
85    
86  int _PLfuse_readlink(const char *file,char *buf,size_t buflen) {  int _PLfuse_readlink(const char *file,char *buf,size_t buflen) {
87          int rv;          int rv;
         char *rvstr;  
         I32 ax;  
88          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
89          dSP;          dSP;
90          if(buflen < 1)          if(buflen < 1)
# Line 119  int _PLfuse_readlink(const char *file,ch Line 117  int _PLfuse_readlink(const char *file,ch
117          return rv;          return rv;
118  }  }
119    
120    #if 0
121    /*
122     * This doesn't yet work... we alwas get ENOSYS when trying to use readdir().
123     * Well, of course, getdir() is fine as well.
124     */
125     int _PLfuse_readdir(const char *file, void *dirh, fuse_fill_dir_t dirfil, off_t off, struct fuse_file_info *fi) {
126    #endif
127  int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) {  int _PLfuse_getdir(const char *file, fuse_dirh_t dirh, fuse_dirfil_t dirfil) {
128          int prv, rv;          int prv, rv;
129          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
# Line 134  int _PLfuse_getdir(const char *file, fus Line 139  int _PLfuse_getdir(const char *file, fus
139          if(prv) {          if(prv) {
140                  rv = POPi;                  rv = POPi;
141                  while(--prv)                  while(--prv)
142                          dirfil(dirh,POPp,0);                          dirfil(dirh,POPp,0,0);
143          } else {          } else {
144                  fprintf(stderr,"getdir() handler returned nothing!\n");                  fprintf(stderr,"getdir() handler returned nothing!\n");
145                  rv = -ENOSYS;                  rv = -ENOSYS;
# Line 149  int _PLfuse_getdir(const char *file, fus Line 154  int _PLfuse_getdir(const char *file, fus
154    
155  int _PLfuse_mknod (const char *file, mode_t mode, dev_t dev) {  int _PLfuse_mknod (const char *file, mode_t mode, dev_t dev) {
156          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
157          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
158          dSP;          dSP;
159          DEBUGf("mknod begin\n");          DEBUGf("mknod begin\n");
# Line 177  int _PLfuse_mknod (const char *file, mod Line 180  int _PLfuse_mknod (const char *file, mod
180    
181  int _PLfuse_mkdir (const char *file, mode_t mode) {  int _PLfuse_mkdir (const char *file, mode_t mode) {
182          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
183          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
184          dSP;          dSP;
185          DEBUGf("mkdir begin\n");          DEBUGf("mkdir begin\n");
# Line 205  int _PLfuse_mkdir (const char *file, mod Line 206  int _PLfuse_mkdir (const char *file, mod
206    
207  int _PLfuse_unlink (const char *file) {  int _PLfuse_unlink (const char *file) {
208          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
209          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
210          dSP;          dSP;
211          DEBUGf("unlink begin\n");          DEBUGf("unlink begin\n");
# Line 231  int _PLfuse_unlink (const char *file) { Line 230  int _PLfuse_unlink (const char *file) {
230    
231  int _PLfuse_rmdir (const char *file) {  int _PLfuse_rmdir (const char *file) {
232          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
233          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
234          dSP;          dSP;
235          DEBUGf("rmdir begin\n");          DEBUGf("rmdir begin\n");
# Line 257  int _PLfuse_rmdir (const char *file) { Line 254  int _PLfuse_rmdir (const char *file) {
254    
255  int _PLfuse_symlink (const char *file, const char *new) {  int _PLfuse_symlink (const char *file, const char *new) {
256          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
257          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
258          dSP;          dSP;
259          DEBUGf("symlink begin\n");          DEBUGf("symlink begin\n");
# Line 284  int _PLfuse_symlink (const char *file, c Line 279  int _PLfuse_symlink (const char *file, c
279    
280  int _PLfuse_rename (const char *file, const char *new) {  int _PLfuse_rename (const char *file, const char *new) {
281          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
282          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
283          dSP;          dSP;
284          DEBUGf("rename begin\n");          DEBUGf("rename begin\n");
# Line 311  int _PLfuse_rename (const char *file, co Line 304  int _PLfuse_rename (const char *file, co
304    
305  int _PLfuse_link (const char *file, const char *new) {  int _PLfuse_link (const char *file, const char *new) {
306          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
307          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
308          dSP;          dSP;
309          DEBUGf("link begin\n");          DEBUGf("link begin\n");
# Line 338  int _PLfuse_link (const char *file, cons Line 329  int _PLfuse_link (const char *file, cons
329    
330  int _PLfuse_chmod (const char *file, mode_t mode) {  int _PLfuse_chmod (const char *file, mode_t mode) {
331          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
332          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
333          dSP;          dSP;
334          DEBUGf("chmod begin\n");          DEBUGf("chmod begin\n");
# Line 365  int _PLfuse_chmod (const char *file, mod Line 354  int _PLfuse_chmod (const char *file, mod
354    
355  int _PLfuse_chown (const char *file, uid_t uid, gid_t gid) {  int _PLfuse_chown (const char *file, uid_t uid, gid_t gid) {
356          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
357          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
358          dSP;          dSP;
359          DEBUGf("chown begin\n");          DEBUGf("chown begin\n");
# Line 393  int _PLfuse_chown (const char *file, uid Line 380  int _PLfuse_chown (const char *file, uid
380    
381  int _PLfuse_truncate (const char *file, off_t off) {  int _PLfuse_truncate (const char *file, off_t off) {
382          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
383          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
384          dSP;          dSP;
385          DEBUGf("truncate begin\n");          DEBUGf("truncate begin\n");
# Line 420  int _PLfuse_truncate (const char *file, Line 405  int _PLfuse_truncate (const char *file,
405    
406  int _PLfuse_utime (const char *file, struct utimbuf *uti) {  int _PLfuse_utime (const char *file, struct utimbuf *uti) {
407          int rv;          int rv;
         SV *rvsv;  
         char *rvstr;  
408          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
409          dSP;          dSP;
410          DEBUGf("utime begin\n");          DEBUGf("utime begin\n");
# Line 446  int _PLfuse_utime (const char *file, str Line 429  int _PLfuse_utime (const char *file, str
429          return rv;          return rv;
430  }  }
431    
432  int _PLfuse_open (const char *file, int flags) {  int _PLfuse_open (const char *file, struct fuse_file_info *fi) {
433          int rv;          int rv;
434          SV *rvsv;          int flags = fi->flags;
         char *rvstr;  
435          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
436          dSP;          dSP;
437          DEBUGf("open begin\n");          DEBUGf("open begin\n");
# Line 473  int _PLfuse_open (const char *file, int Line 455  int _PLfuse_open (const char *file, int
455          return rv;          return rv;
456  }  }
457    
458  int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off) {  int _PLfuse_read (const char *file, char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) {
459          int rv;          int rv;
         char *rvstr;  
460          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
461          dSP;          dSP;
462          DEBUGf("read begin\n");          DEBUGf("read begin\n");
# Line 514  int _PLfuse_read (const char *file, char Line 495  int _PLfuse_read (const char *file, char
495          return rv;          return rv;
496  }  }
497    
498  int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off) {  int _PLfuse_write (const char *file, const char *buf, size_t buflen, off_t off, struct fuse_file_info *fi) {
499          int rv;          int rv;
         char *rvstr;  
500          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
501          dSP;          dSP;
502          DEBUGf("write begin\n");          DEBUGf("write begin\n");
# Line 541  int _PLfuse_write (const char *file, con Line 521  int _PLfuse_write (const char *file, con
521          return rv;          return rv;
522  }  }
523    
524  /* FIXME check for old fuse API (< 21?) and use statfs here */  int _PLfuse_statfs (const char *file, struct statvfs *st) {
 #ifdef __FreeBSD__  
  #define _fuse_statvfs statfs  
 #else  
  #define _fuse_statvfs statvfs  
 #endif  
 int _PLfuse_statfs (const char *file, struct _fuse_statvfs *st) {  
   
525          int rv;          int rv;
         char *rvstr;  
526          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
527          dSP;          dSP;
528          DEBUGf("statfs begin\n");          DEBUGf("statfs begin\n");
# Line 568  int _PLfuse_statfs (const char *file, st Line 540  int _PLfuse_statfs (const char *file, st
540                  st->f_ffree     = POPi;                  st->f_ffree     = POPi;
541                  st->f_files     = POPi;                  st->f_files     = POPi;
542                  st->f_namemax   = POPi;                  st->f_namemax   = POPi;
 #ifndef __FreeBSD__  
543                  /* zero and fill-in other */                  /* zero and fill-in other */
544                  st->f_fsid = 0;                  st->f_fsid = 0;
545                  st->f_frsize = 4096;                  st->f_frsize = 4096;
546                  st->f_flag = 0;                  st->f_flag = 0;
547                  st->f_bavail = st->f_bfree;                  st->f_bavail = st->f_bfree;
548                  st->f_favail = st->f_ffree;                  st->f_favail = st->f_ffree;
 #endif  
549    
550                  if(rv == 7)                  if(rv == 7)
551                          rv = POPi;                          rv = POPi;
# Line 597  int _PLfuse_statfs (const char *file, st Line 567  int _PLfuse_statfs (const char *file, st
567          return rv;          return rv;
568  }  }
569    
570  int _PLfuse_flush (const char *file) {  int _PLfuse_flush (const char *file, struct fuse_file_info *fi) {
571          int rv;          int rv;
         char *rvstr;  
572          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
573          dSP;          dSP;
574          DEBUGf("flush begin\n");          DEBUGf("flush begin\n");
# Line 622  int _PLfuse_flush (const char *file) { Line 591  int _PLfuse_flush (const char *file) {
591          return rv;          return rv;
592  }  }
593    
594  int _PLfuse_release (const char *file, int flags) {  int _PLfuse_release (const char *file, struct fuse_file_info *fi) {
595          int rv;          int rv;
596          char *rvstr;          int flags = fi->flags;
597          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
598          dSP;          dSP;
599          DEBUGf("release begin\n");          DEBUGf("release begin\n");
# Line 648  int _PLfuse_release (const char *file, i Line 617  int _PLfuse_release (const char *file, i
617          return rv;          return rv;
618  }  }
619    
620  int _PLfuse_fsync (const char *file, int flags) {  int _PLfuse_fsync (const char *file, int datasync, struct fuse_file_info *fi) {
621          int rv;          int rv;
622          char *rvstr;          int flags = fi->flags;
623          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
624          dSP;          dSP;
625          DEBUGf("fsync begin\n");          DEBUGf("fsync begin\n");
# Line 676  int _PLfuse_fsync (const char *file, int Line 645  int _PLfuse_fsync (const char *file, int
645    
646  int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_t buflen, int flags) {  int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_t buflen, int flags) {
647          int rv;          int rv;
         char *rvstr;  
648          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
649          dSP;          dSP;
650          DEBUGf("setxattr begin\n");          DEBUGf("setxattr begin\n");
# Line 704  int _PLfuse_setxattr (const char *file, Line 672  int _PLfuse_setxattr (const char *file,
672    
673  int _PLfuse_getxattr (const char *file, const char *name, char *buf, size_t buflen) {  int _PLfuse_getxattr (const char *file, const char *name, char *buf, size_t buflen) {
674          int rv;          int rv;
         char *rvstr;  
675          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
676          dSP;          dSP;
677          DEBUGf("getxattr begin\n");          DEBUGf("getxattr begin\n");
# Line 749  int _PLfuse_getxattr (const char *file, Line 716  int _PLfuse_getxattr (const char *file,
716    
717  int _PLfuse_listxattr (const char *file, char *list, size_t size) {  int _PLfuse_listxattr (const char *file, char *list, size_t size) {
718          int prv, rv;          int prv, rv;
         char *rvstr;  
719          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
720          dSP;          dSP;
721          DEBUGf("listxattr begin\n");          DEBUGf("listxattr begin\n");
# Line 767  int _PLfuse_listxattr (const char *file, Line 733  int _PLfuse_listxattr (const char *file,
733                  char *p = list;                  char *p = list;
734                  int spc = size;                  int spc = size;
735                  int total_len = 0;                  int total_len = 0;
                 int i;  
736    
737                  rv = POPi;                  rv = POPi;
738                  prv--;                  prv--;
# Line 816  int _PLfuse_listxattr (const char *file, Line 781  int _PLfuse_listxattr (const char *file,
781    
782  int _PLfuse_removexattr (const char *file, const char *name) {  int _PLfuse_removexattr (const char *file, const char *name) {
783          int rv;          int rv;
         char *rvstr;  
784          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
785          dSP;          dSP;
786          DEBUGf("removexattr begin\n");          DEBUGf("removexattr begin\n");
# Line 844  struct fuse_operations _available_ops = Line 808  struct fuse_operations _available_ops =
808  getattr:                _PLfuse_getattr,  getattr:                _PLfuse_getattr,
809  readlink:               _PLfuse_readlink,  readlink:               _PLfuse_readlink,
810  getdir:                 _PLfuse_getdir,  getdir:                 _PLfuse_getdir,
811    #if 0
812    readdir:                _PLfuse_readdir,
813    #endif
814  mknod:                  _PLfuse_mknod,  mknod:                  _PLfuse_mknod,
815  mkdir:                  _PLfuse_mkdir,  mkdir:                  _PLfuse_mkdir,
816  unlink:                 _PLfuse_unlink,  unlink:                 _PLfuse_unlink,
# Line 877  perl_fuse_main(...) Line 844  perl_fuse_main(...)
844          struct fuse_operations fops =          struct fuse_operations fops =
845                  {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,                  {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
846                   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};                   NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
847          int i, fd, varnum = 0, debug, threaded, have_mnt;          int i, fd, debug, threaded;
848          char *mountpoint;          char *mountpoint;
849          char *mountopts;          char *mountopts;
850          STRLEN n_a;          struct fuse_args margs = FUSE_ARGS_INIT(0, NULL);
851          STRLEN l;          struct fuse_args fargs = FUSE_ARGS_INIT(0, NULL);
852          INIT:          INIT:
853          if(items != 29) {          if(items != 29) {
854                  fprintf(stderr,"Perl<->C inconsistency or internal error\n");                  fprintf(stderr,"Perl<->C inconsistency or internal error\n");
# Line 921  perl_fuse_main(...) Line 888  perl_fuse_main(...)
888                                i+4,SvPVbyte_nolen(var));                                i+4,SvPVbyte_nolen(var));
889                  }                  }
890          }          }
891          /* FIXME: need to pass fusermount arguments */          /*
892          fd = fuse_mount(mountpoint,mountopts);           * XXX: What comes here is just a ridiculous use of the option parsing API
893             * to hack on compatibility with other parts of the new API. First and
894             * foremost, real C argc/argv would be good to get at...
895             */
896            if (mountopts &&
897                (fuse_opt_add_arg(&margs, "") == -1 ||
898                 fuse_opt_add_arg(&margs, "-o") == -1 ||
899                 fuse_opt_add_arg(&margs, mountopts) == -1)) {
900                    fuse_opt_free_args(&margs);
901                    croak("out of memory\n");
902            }
903            fd = fuse_mount(mountpoint,&margs);
904            fuse_opt_free_args(&margs);        
905          if(fd < 0)          if(fd < 0)
906                  croak("could not mount fuse filesystem!");                  croak("could not mount fuse filesystem!\n");
907            if (debug) {
908                    if ( fuse_opt_add_arg(&fargs, "") == -1 ||
909                            fuse_opt_add_arg(&fargs, "-d") == -1) {
910                            fuse_opt_free_args(&fargs);
911                            croak("out of memory\n");
912                    }
913            } else {
914                    if (fuse_opt_add_arg(&fargs, "") == -1)
915                            croak("out of memory\n");
916            }
917    
918          if(threaded) {          if(threaded) {
919                  fuse_loop_mt(fuse_new(fd,debug ? "debug" : NULL,&fops));                  fuse_loop_mt(fuse_new(fd,&fargs,&fops,sizeof(fops)));
920          } else          } else
921                  fuse_loop(fuse_new(fd,debug ? "debug" : NULL,&fops));                  fuse_loop(fuse_new(fd,&fargs,&fops,sizeof(fops)));
922            fuse_opt_free_args(&fargs);

Legend:
Removed from v.71  
changed lines
  Added in v.92

  ViewVC Help
Powered by ViewVC 1.1.26