/[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 8 by dpavlin, Fri Nov 26 20:38:56 2004 UTC revision 16 by dpavlin, Wed Jun 22 16:15:17 2005 UTC
# Line 11  Line 11 
11  #define DEBUGf(a...)  #define DEBUGf(a...)
12  #endif  #endif
13    
14  SV *_PLfuse_callbacks[18];  #define N_CALLBACKS 25
15    SV *_PLfuse_callbacks[N_CALLBACKS];
16    
17  int _PLfuse_getattr(const char *file, struct stat *result) {  int _PLfuse_getattr(const char *file, struct stat *result) {
18          dSP;          dSP;
# Line 98  int _PLfuse_getdir(const char *file, fus Line 99  int _PLfuse_getdir(const char *file, fus
99          if(prv) {          if(prv) {
100                  rv = POPi;                  rv = POPi;
101                  while(--prv)                  while(--prv)
102                          dirfil(dirh,POPp,0,0);                          dirfil(dirh,POPp,0);
103          } else {          } else {
104                  fprintf(stderr,"getdir() handler returned nothing!\n");                  fprintf(stderr,"getdir() handler returned nothing!\n");
105                  rv = -ENOSYS;                  rv = -ENOSYS;
# Line 510  int _PLfuse_statfs (const char *file, st Line 511  int _PLfuse_statfs (const char *file, st
511          return rv;          return rv;
512  }  }
513    
514    int _PLfuse_flush (const char *file) {
515            int rv;
516            char *rvstr;
517            dSP;
518            DEBUGf("flush begin: %i\n",sp-PL_stack_base);
519            ENTER;
520            SAVETMPS;
521            PUSHMARK(SP);
522            XPUSHs(sv_2mortal(newSVpv(file,0)));
523            PUTBACK;
524            rv = call_sv(_PLfuse_callbacks[18],G_SCALAR);
525            SPAGAIN;
526            if(rv)
527                    rv = POPi;
528            else
529                    rv = 0;
530            FREETMPS;
531            LEAVE;
532            PUTBACK;
533            DEBUGf("flush end: %i\n",sp-PL_stack_base);
534            return rv;
535    }
536    
537    int _PLfuse_release (const char *file, int flags) {
538            int rv;
539            char *rvstr;
540            dSP;
541            DEBUGf("release begin: %i\n",sp-PL_stack_base);
542            ENTER;
543            SAVETMPS;
544            PUSHMARK(SP);
545            XPUSHs(sv_2mortal(newSVpv(file,0)));
546            XPUSHs(sv_2mortal(newSViv(flags)));
547            PUTBACK;
548            rv = call_sv(_PLfuse_callbacks[19],G_SCALAR);
549            SPAGAIN;
550            if(rv)
551                    rv = POPi;
552            else
553                    rv = 0;
554            FREETMPS;
555            LEAVE;
556            PUTBACK;
557            DEBUGf("release end: %i\n",sp-PL_stack_base);
558            return rv;
559    }
560    
561    int _PLfuse_fsync (const char *file, int flags) {
562            int rv;
563            char *rvstr;
564            dSP;
565            DEBUGf("fsync begin: %i\n",sp-PL_stack_base);
566            ENTER;
567            SAVETMPS;
568            PUSHMARK(SP);
569            XPUSHs(sv_2mortal(newSVpv(file,0)));
570            XPUSHs(sv_2mortal(newSViv(flags)));
571            PUTBACK;
572            rv = call_sv(_PLfuse_callbacks[20],G_SCALAR);
573            SPAGAIN;
574            if(rv)
575                    rv = POPi;
576            else
577                    rv = 0;
578            FREETMPS;
579            LEAVE;
580            PUTBACK;
581            DEBUGf("fsync end: %i\n",sp-PL_stack_base);
582            return rv;
583    }
584    
585    int _PLfuse_setxattr (const char *file, const char *name, const char *buf, size_t buflen, int flags) {
586            int rv;
587            char *rvstr;
588            dSP;
589            DEBUGf("setxattr begin: %i\n",sp-PL_stack_base);
590            ENTER;
591            SAVETMPS;
592            PUSHMARK(SP);
593            XPUSHs(sv_2mortal(newSVpv(file,0)));
594            XPUSHs(sv_2mortal(newSVpv(name,0)));
595            XPUSHs(sv_2mortal(newSVpvn(buf,buflen)));
596            XPUSHs(sv_2mortal(newSViv(flags)));
597            PUTBACK;
598            rv = call_sv(_PLfuse_callbacks[21],G_SCALAR);
599            SPAGAIN;
600            if(rv)
601                    rv = POPi;
602            else
603                    rv = 0;
604            FREETMPS;
605            LEAVE;
606            PUTBACK;
607            DEBUGf("setxattr end: %i\n",sp-PL_stack_base);
608            return rv;
609    }
610    
611    int _PLfuse_getxattr (const char *file, const char *name, char *buf, size_t buflen) {
612            int rv;
613            char *rvstr;
614            dSP;
615            DEBUGf("getxattr begin: %i\n",sp-PL_stack_base);
616            ENTER;
617            SAVETMPS;
618            PUSHMARK(SP);
619            XPUSHs(sv_2mortal(newSVpv(file,0)));
620            XPUSHs(sv_2mortal(newSVpv(name,0)));
621            PUTBACK;
622            rv = call_sv(_PLfuse_callbacks[22],G_SCALAR);
623            SPAGAIN;
624            if(!rv)
625                    rv = -ENOENT;
626            else {
627                    SV *mysv = POPs;
628    
629                    rv = 0;
630                    if(SvTYPE(mysv) == SVt_NV || SvTYPE(mysv) == SVt_IV)
631                            rv = SvIV(mysv);
632                    else {
633                            if(SvPOK(mysv)) {
634                                    rv = SvCUR(mysv);
635                            } else {
636                                    rv = 0;
637                            }
638                            if ((rv > 0) && (buflen > 0))
639                            {
640                                    if(rv > buflen)
641                                            rv = -ERANGE;
642                                    else
643                                            memcpy(buf,SvPV_nolen(mysv),rv);
644                            }
645                    }
646            }
647            FREETMPS;
648            LEAVE;
649            PUTBACK;
650            DEBUGf("getxattr end: %i\n",sp-PL_stack_base);
651            return rv;
652    }
653    
654    int _PLfuse_listxattr (const char *file, char *list, size_t size) {
655            int prv, rv;
656            char *rvstr;
657            dSP;
658            DEBUGf("listxattr begin: %i\n",sp-PL_stack_base);
659            ENTER;
660            SAVETMPS;
661            PUSHMARK(SP);
662            XPUSHs(sv_2mortal(newSVpv(file,0)));
663            PUTBACK;
664            prv = call_sv(_PLfuse_callbacks[23],G_ARRAY);
665            SPAGAIN;
666            if(!prv)
667                    rv = -ENOENT;
668            else {
669    
670                    char *p = list;
671                    int spc = size;
672                    int total_len = 0;
673                    int i;
674    
675                    rv = POPi;
676                    prv--;
677    
678                    /* Always nul terminate */
679                    if (list && (size > 0))
680                            list[0] = '\0';
681    
682                    while (prv > 0)
683                    {
684                            SV *mysv = POPs;
685                            prv--;
686    
687                            if (SvPOK(mysv)) {
688                                    /* Copy nul too */
689                                    int s = SvCUR(mysv) + 1;
690                                    total_len += s;
691    
692                                    if (p && (size > 0) && (spc >= s))
693                                    {
694                                            memcpy(p,SvPV_nolen(mysv),s);
695                                            p += s;
696                                            spc -= s;
697                                    }
698                            }
699                    }
700    
701                    /*
702                     * If the Perl returned an error, return that.
703                     * Otherwise check that the buffer was big enough.
704                     */
705                    if (rv == 0)
706                    {
707                            rv = total_len;
708                            if ((size > 0) && (size < total_len))
709                                    rv = -ERANGE;
710                    }
711            }
712            FREETMPS;
713            LEAVE;
714            PUTBACK;
715            DEBUGf("listxattr end: %i\n",sp-PL_stack_base);
716            return rv;
717    }
718    
719    int _PLfuse_removexattr (const char *file, const char *name) {
720            int rv;
721            char *rvstr;
722            dSP;
723            DEBUGf("removexattr begin: %i\n",sp-PL_stack_base);
724            ENTER;
725            SAVETMPS;
726            PUSHMARK(SP);
727            XPUSHs(sv_2mortal(newSVpv(file,0)));
728            XPUSHs(sv_2mortal(newSVpv(name,0)));
729            PUTBACK;
730            rv = call_sv(_PLfuse_callbacks[24],G_SCALAR);
731            SPAGAIN;
732            if(rv)
733                    rv = POPi;
734            else
735                    rv = 0;
736            FREETMPS;
737            LEAVE;
738            PUTBACK;
739            DEBUGf("removexattr end: %i\n",sp-PL_stack_base);
740            return rv;
741    }
742    
743  struct fuse_operations _available_ops = {  struct fuse_operations _available_ops = {
744  getattr:        _PLfuse_getattr,  getattr:                _PLfuse_getattr,
745                          _PLfuse_readlink,  readlink:               _PLfuse_readlink,
746                          _PLfuse_getdir,  getdir:                 _PLfuse_getdir,
747                          _PLfuse_mknod,  mknod:                  _PLfuse_mknod,
748                          _PLfuse_mkdir,  mkdir:                  _PLfuse_mkdir,
749                          _PLfuse_unlink,  unlink:                 _PLfuse_unlink,
750                          _PLfuse_rmdir,  rmdir:                  _PLfuse_rmdir,
751                          _PLfuse_symlink,  symlink:                _PLfuse_symlink,
752                          _PLfuse_rename,  rename:                 _PLfuse_rename,
753                          _PLfuse_link,  link:                   _PLfuse_link,
754                          _PLfuse_chmod,  chmod:                  _PLfuse_chmod,
755                          _PLfuse_chown,  chown:                  _PLfuse_chown,
756                          _PLfuse_truncate,  truncate:               _PLfuse_truncate,
757                          _PLfuse_utime,  utime:                  _PLfuse_utime,
758                          _PLfuse_open,  open:                   _PLfuse_open,
759                          _PLfuse_read,  read:                   _PLfuse_read,
760                          _PLfuse_write,  write:                  _PLfuse_write,
761                          _PLfuse_statfs  statfs:                 _PLfuse_statfs,
762    flush:                  _PLfuse_flush,
763    release:                _PLfuse_release,
764    fsync:                  _PLfuse_fsync,
765    setxattr:               _PLfuse_setxattr,
766    getxattr:               _PLfuse_getxattr,
767    listxattr:              _PLfuse_listxattr,
768    removexattr:            _PLfuse_removexattr,
769  };  };
770    
771  MODULE = Fuse           PACKAGE = Fuse  MODULE = Fuse           PACKAGE = Fuse
# Line 537  PROTOTYPES: DISABLE Line 774  PROTOTYPES: DISABLE
774  void  void
775  perl_fuse_main(...)  perl_fuse_main(...)
776          PREINIT:          PREINIT:
777          struct fuse_operations fops = {NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};          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};
778          int i, fd, varnum = 0, debug, have_mnt;          int i, fd, varnum = 0, debug, have_mnt;
779          char *mountpoint;          char *mountpoint;
780            char *mountopts;
781          STRLEN n_a;          STRLEN n_a;
782          STRLEN l;          STRLEN l;
783          INIT:          INIT:
784          if(items != 20) {          if(items != 28) {
785                  fprintf(stderr,"Perl<->C inconsistency or internal error\n");                  fprintf(stderr,"Perl<->C inconsistency or internal error\n");
786                  XSRETURN_UNDEF;                  XSRETURN_UNDEF;
787          }          }
788          CODE:          CODE:
789          debug = SvIV(ST(0));          debug = SvIV(ST(0));
790          mountpoint = SvPV_nolen(ST(1));          mountpoint = SvPV_nolen(ST(1));
791            mountopts = SvPV_nolen(ST(2));
792          /* FIXME: reevaluate multithreading support when perl6 arrives */          /* FIXME: reevaluate multithreading support when perl6 arrives */
793          for(i=0;i<18;i++) {          for(i=0;i<N_CALLBACKS;i++) {
794                  SV *var = ST(i+2);                  SV *var = ST(i+3);
795                  if((var != &PL_sv_undef) && SvROK(var)) {                  if((var != &PL_sv_undef) && SvROK(var)) {
796                          if(SvTYPE(SvRV(var)) == SVt_PVCV) {                          if(SvTYPE(SvRV(var)) == SVt_PVCV) {
797                                  void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops;                                  void **tmp1 = (void**)&_available_ops, **tmp2 = (void**)&fops;
# Line 563  perl_fuse_main(...) Line 802  perl_fuse_main(...)
802                  }                  }
803          }          }
804          /* FIXME: need to pass fusermount arguments */          /* FIXME: need to pass fusermount arguments */
805          fd = fuse_mount(mountpoint,NULL);          fd = fuse_mount(mountpoint,mountopts);
806          if(fd < 0)          if(fd < 0)
807                  croak("could not mount fuse filesystem!");                  croak("could not mount fuse filesystem!");
808          fuse_loop(fuse_new(fd,debug ? "debug" : NULL,&fops));          fuse_loop(fuse_new(fd,debug ? "debug" : NULL,&fops));

Legend:
Removed from v.8  
changed lines
  Added in v.16

  ViewVC Help
Powered by ViewVC 1.1.26