/[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

perl/trunk/Fuse.xs revision 18 by dpavlin, Wed Dec 21 15:33:37 2005 UTC perl-llin/Fuse.xs revision 85 by dpavlin, Tue Jan 17 17:00:12 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 119  int _PLfuse_readlink(const char *file,ch Line 119  int _PLfuse_readlink(const char *file,ch
119          return rv;          return rv;
120  }  }
121    
122    #if 0
123    /*
124     * This doesn't yet work... we alwas get ENOSYS when trying to use readdir().
125     * Well, of course, getdir() is fine as well.
126     */
127     int _PLfuse_readdir(const char *file, void *dirh, fuse_fill_dir_t dirfil, off_t off, struct fuse_file_info *fi) {
128    #endif
129  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) {
130          int prv, rv;          int prv, rv;
131          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
# Line 134  int _PLfuse_getdir(const char *file, fus Line 141  int _PLfuse_getdir(const char *file, fus
141          if(prv) {          if(prv) {
142                  rv = POPi;                  rv = POPi;
143                  while(--prv)                  while(--prv)
144                          dirfil(dirh,POPp,0);                          dirfil(dirh,POPp,0,0);
145          } else {          } else {
146                  fprintf(stderr,"getdir() handler returned nothing!\n");                  fprintf(stderr,"getdir() handler returned nothing!\n");
147                  rv = -ENOSYS;                  rv = -ENOSYS;
# Line 446  int _PLfuse_utime (const char *file, str Line 453  int _PLfuse_utime (const char *file, str
453          return rv;          return rv;
454  }  }
455    
456  int _PLfuse_open (const char *file, int flags) {  int _PLfuse_open (const char *file, struct fuse_file_info *fi) {
457          int rv;          int rv;
458          SV *rvsv;          SV *rvsv;
459          char *rvstr;          char *rvstr;
460            int flags = fi->flags;
461          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
462          dSP;          dSP;
463          DEBUGf("open begin\n");          DEBUGf("open begin\n");
# Line 473  int _PLfuse_open (const char *file, int Line 481  int _PLfuse_open (const char *file, int
481          return rv;          return rv;
482  }  }
483    
484  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) {
485          int rv;          int rv;
486          char *rvstr;          char *rvstr;
487          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
# Line 501  int _PLfuse_read (const char *file, char Line 509  int _PLfuse_read (const char *file, char
509                                  rv = 0;                                  rv = 0;
510                          }                          }
511                          if(rv > buflen)                          if(rv > buflen)
512                                  croak("%i: read() handler returned more than buflen! (%i > %i)",getpid(),rv,buflen);                                  croak("read() handler returned more than buflen! (%i > %i)",rv,buflen);
513                          if(rv)                          if(rv)
514                                  memcpy(buf,SvPV_nolen(mysv),rv);                                  memcpy(buf,SvPV_nolen(mysv),rv);
515                  }                  }
# Line 514  int _PLfuse_read (const char *file, char Line 522  int _PLfuse_read (const char *file, char
522          return rv;          return rv;
523  }  }
524    
525  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) {
526          int rv;          int rv;
527          char *rvstr;          char *rvstr;
528          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
# Line 541  int _PLfuse_write (const char *file, con Line 549  int _PLfuse_write (const char *file, con
549          return rv;          return rv;
550  }  }
551    
552  int _PLfuse_statfs (const char *file, struct statfs *st) {  int _PLfuse_statfs (const char *file, struct statvfs *st) {
553          int rv;          int rv;
554          char *rvstr;          char *rvstr;
555          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
# Line 553  int _PLfuse_statfs (const char *file, st Line 561  int _PLfuse_statfs (const char *file, st
561          PUTBACK;          PUTBACK;
562          rv = call_sv(_PLfuse_callbacks[17],G_ARRAY);          rv = call_sv(_PLfuse_callbacks[17],G_ARRAY);
563          SPAGAIN;          SPAGAIN;
564          if(rv > 5) {          DEBUGf("statfs got %i params\n",rv);
565                  st->f_bsize    = POPi;          if(rv == 6 || rv == 7) {
566                  st->f_bfree    = POPi;                  st->f_bsize     = POPi;
567                  st->f_blocks   = POPi;                  st->f_bfree     = POPi;
568                  st->f_ffree    = POPi;                  st->f_blocks    = POPi;
569                  st->f_files    = POPi;                  st->f_ffree     = POPi;
570                  st->f_namelen  = POPi;                  st->f_files     = POPi;
571                  if(rv > 6)                  st->f_namemax   = POPi;
572                    /* zero and fill-in other */
573                    st->f_fsid = 0;
574                    st->f_frsize = 4096;
575                    st->f_flag = 0;
576                    st->f_bavail = st->f_bfree;
577                    st->f_favail = st->f_ffree;
578    
579                    if(rv == 7)
580                          rv = POPi;                          rv = POPi;
581                  else                  else
582                          rv = 0;                          rv = 0;
# Line 580  int _PLfuse_statfs (const char *file, st Line 596  int _PLfuse_statfs (const char *file, st
596          return rv;          return rv;
597  }  }
598    
599  int _PLfuse_flush (const char *file) {  int _PLfuse_flush (const char *file, struct fuse_file_info *fi) {
600          int rv;          int rv;
601          char *rvstr;          char *rvstr;
602          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
# Line 605  int _PLfuse_flush (const char *file) { Line 621  int _PLfuse_flush (const char *file) {
621          return rv;          return rv;
622  }  }
623    
624  int _PLfuse_release (const char *file, int flags) {  int _PLfuse_release (const char *file, struct fuse_file_info *fi) {
625          int rv;          int rv;
626          char *rvstr;          char *rvstr;
627            int flags = fi->flags;
628          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
629          dSP;          dSP;
630          DEBUGf("release begin\n");          DEBUGf("release begin\n");
# Line 631  int _PLfuse_release (const char *file, i Line 648  int _PLfuse_release (const char *file, i
648          return rv;          return rv;
649  }  }
650    
651  int _PLfuse_fsync (const char *file, int flags) {  int _PLfuse_fsync (const char *file, int datasync, struct fuse_file_info *fi) {
652          int rv;          int rv;
653          char *rvstr;          char *rvstr;
654            int flags = fi->flags;
655          FUSE_CONTEXT_PRE;          FUSE_CONTEXT_PRE;
656          dSP;          dSP;
657          DEBUGf("fsync begin\n");          DEBUGf("fsync begin\n");
# Line 827  struct fuse_operations _available_ops = Line 845  struct fuse_operations _available_ops =
845  getattr:                _PLfuse_getattr,  getattr:                _PLfuse_getattr,
846  readlink:               _PLfuse_readlink,  readlink:               _PLfuse_readlink,
847  getdir:                 _PLfuse_getdir,  getdir:                 _PLfuse_getdir,
848    #if 0
849    readdir:                _PLfuse_readdir,
850    #endif
851  mknod:                  _PLfuse_mknod,  mknod:                  _PLfuse_mknod,
852  mkdir:                  _PLfuse_mkdir,  mkdir:                  _PLfuse_mkdir,
853  unlink:                 _PLfuse_unlink,  unlink:                 _PLfuse_unlink,
# Line 857  PROTOTYPES: DISABLE Line 878  PROTOTYPES: DISABLE
878  void  void
879  perl_fuse_main(...)  perl_fuse_main(...)
880          PREINIT:          PREINIT:
881          struct fuse_operations fops = {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};          struct fuse_operations fops =
882                    {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
883                     NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
884          int i, fd, varnum = 0, debug, threaded, have_mnt;          int i, fd, varnum = 0, debug, threaded, have_mnt;
885          char *mountpoint;          char *mountpoint;
886          char *mountopts;          char *mountopts;
887            struct fuse_args margs = FUSE_ARGS_INIT(0, NULL);
888            struct fuse_args fargs = FUSE_ARGS_INIT(0, NULL);
889          STRLEN n_a;          STRLEN n_a;
890          STRLEN l;          STRLEN l;
891          INIT:          INIT:
# Line 885  perl_fuse_main(...) Line 910  perl_fuse_main(...)
910          mountopts = SvPV_nolen(ST(3));          mountopts = SvPV_nolen(ST(3));
911          for(i=0;i<N_CALLBACKS;i++) {          for(i=0;i<N_CALLBACKS;i++) {
912                  SV *var = ST(i+4);                  SV *var = ST(i+4);
913          /* allow symbolic references, or real code references. */                  /* allow symbolic references, or real code references. */
914                  if((var != &PL_sv_undef) && (SvPOK(var) || (SvROK(var) && SvTYPE(SvRV(var)) == SVt_PVCV))) {                  if(SvOK(var) && (SvPOK(var) || (SvROK(var) && SvTYPE(SvRV(var)) == SVt_PVCV))) {
915                          void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops;                          void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops;
916                          tmp2[i] = tmp1[i];                          tmp2[i] = tmp1[i];
917    #ifdef FUSE_USE_ITHREADS
918                          if(threaded)                          if(threaded)
919                  /* note: under 5.8.7, this croaks for code references. */                  /* note: under 5.8.7, this croaks for code references. */
920                  SvSHARE(var);                  SvSHARE(var);
921    #endif
922                          _PLfuse_callbacks[i] = var;                          _PLfuse_callbacks[i] = var;
923                    } else
924                    if(SvOK(var)) {
925                            croak("invalid callback passed to perl_fuse_main "
926                                  "(%s is not a string, code ref, or undef).\n",
927                                  i+4,SvPVbyte_nolen(var));
928                  }                  }
929          }          }
930          /* FIXME: need to pass fusermount arguments */          /*
931          fd = fuse_mount(mountpoint,mountopts);           * XXX: What comes here is just a ridiculous use of the option parsing API
932             * to hack on compatibility with other parts of the new API. First and
933             * foremost, real C argc/argv would be good to get at...
934             */
935            if (mountopts &&
936                (fuse_opt_add_arg(&margs, "") == -1 ||
937                 fuse_opt_add_arg(&margs, "-o") == -1 ||
938                 fuse_opt_add_arg(&margs, mountopts) == -1)) {
939                    fuse_opt_free_args(&margs);
940                    croak("out of memory\n");
941            }
942            fd = fuse_mount(mountpoint,&margs);
943            fuse_opt_free_args(&margs);        
944          if(fd < 0)          if(fd < 0)
945                  croak("could not mount fuse filesystem!");                  croak("could not mount fuse filesystem!");
946            if (debug &&
947                (fuse_opt_add_arg(&fargs, "") == -1 ||
948                 fuse_opt_add_arg(&fargs, "-d") == -1)) {
949                    fuse_opt_free_args(&fargs);
950                    croak("out of memory\n");
951            }
952          if(threaded) {          if(threaded) {
953                  fuse_loop_mt(fuse_new(fd,debug ? "debug" : NULL,&fops));                  fuse_loop_mt(fuse_new(fd,&fargs,&fops,sizeof(fops)/sizeof(void*)));
954          } else          } else
955                  fuse_loop(fuse_new(fd,debug ? "debug" : NULL,&fops));                  fuse_loop(fuse_new(fd,&fargs,&fops,sizeof(fops)/sizeof(void*)));
956            fuse_opt_free_args(&fargs);

Legend:
Removed from v.18  
changed lines
  Added in v.85

  ViewVC Help
Powered by ViewVC 1.1.26