a0cd4d2000-09-13Per Hedbor inherit "module";
f0d6942001-01-29Per Hedbor constant cvs_version= "$Id: tarfs.pike,v 1.5 2001/01/29 05:40:30 per Exp $";
a0cd4d2000-09-13Per Hedbor  // The Filesystem.Tar module is not threadsafe. constant thread_safe=0;
f0d6942001-01-29Per Hedbor //<locale-token project="mod_targs">_</locale-token> #define _(X,Y) _DEF_LOCALE("mod_tarfs",X,Y) // end of the locale related stuff
a0cd4d2000-09-13Per Hedbor #include <module.h> constant module_type = MODULE_LOCATION;
f0d6942001-01-29Per Hedbor LocaleString module_name = _(0,"Tarfile system"); LocaleString module_doc = _(0,"This is a file system module that makes it possible to mount a "
a0cd4d2000-09-13Per Hedbor  "directory structure from a tar-file directly on the site. gzip compressed " "tar-files are not supported"); constant module_unique = 0; void create() {
f0d6942001-01-29Per Hedbor  defvar( "mountpoint", "/", _(0,"Mount point"), TYPE_LOCATION|VAR_INITIAL, _(0,"Where the module will be mounted in the site's virtual file " "system.") );
a0cd4d2000-09-13Per Hedbor 
3385652000-09-23Per Hedbor  defvar("tarfile", "config_interface/docs.tar",
f0d6942001-01-29Per Hedbor  _(0,"Tar file and root path"), TYPE_FILE|VAR_INITIAL, _(0,"The tarfile, and an optional root path (syntax: /tar/file.tar:/" "root/dir/)") );
a0cd4d2000-09-13Per Hedbor } string mp, error_msg;
9739932000-09-14Per Hedbor 
9ceb8b2000-09-25Per Hedbor Filesystem.Tar tar;
a0cd4d2000-09-13Per Hedbor  void start() { string path = "", tf = query( "tarfile" ); mp = query("mountpoint"); sscanf( tf, "%s:%s", tf, path ); tar = 0; if( catch(tar = Filesystem.Tar( tf )) ) { report_error( "Failed to open tar-file "+tf+"!" ); tar = 0; } else if( strlen( path ) ) tar->cd( path ); } string query_location() { return mp; }
f0d6942001-01-29Per Hedbor Stat stat_file( string f, RequestID id )
a0cd4d2000-09-13Per Hedbor { if(!tar) return 0; object s = tar->stat( f ); if( s ) return ({ s->mode, s->size, s->atime, s->mtime, s->ctime, s->uid, s->gid }); } string real_file( string f, RequestID id ) { return 0; } array find_dir( string f, RequestID id ) { if(!tar) return 0; return tar->get_dir( f ); } mixed find_file( string f, RequestID id ) { if(!tar) return 0; object s = tar->stat( f ); if( !s ) return 0; if( s->isdir() ) return -1; return id->conf->StringFile( tar->open( f, "r" )->read(), stat_file( f, id )); }