mod_test.c
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:6k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. #include "conf.h"
  2. typedef struct test_directory {
  3.   char *path;
  4.   int nents;
  5.   int curent;
  6.   char *ent[25];
  7.   struct dirent dirent;
  8. } testdir_t;
  9. static char local[MAXPATHLEN];
  10. static char local_cwd[MAXPATHLEN] = "/";
  11. static int get_local(fsdir_t *f, const char *path, char *buf, int maxlen)
  12. {
  13.   char tmp[MAXPATHLEN];
  14.   register int l = strlen(f->name);
  15.   if(*path == '/' && !strncmp(f->name,path,l))
  16.     sstrncpy(tmp, path + l, sizeof(tmp) > maxlen ? maxlen : sizeof(tmp));
  17.   else {
  18.     *tmp = '';
  19.     fs_dircat(tmp,sizeof(tmp),local_cwd,path);
  20.   }
  21.   
  22.   fs_clean_path(tmp, buf, maxlen);
  23.   return 0;
  24. }
  25. static int my_chdir(fsdir_t *f, const char *path)
  26. {
  27.   get_local(f,path,local,sizeof(local));
  28.   
  29.   if(!local[0] || !strcmp(local,"./") || !strcmp(local,"/")) {
  30.     sstrncpy(local_cwd,"/",sizeof(local_cwd));
  31.     return 0;
  32.   } else if(!strcmp(local,"/buttmunch")) {
  33.     sstrncpy(local_cwd,"/buttmunch",sizeof(local_cwd));
  34.     return 0;
  35.   } else if(!strcmp(local,"/")) {
  36.     sstrncpy(local_cwd,"/",sizeof(local_cwd));
  37.     return 0;
  38.   }
  39.   errno = ENOENT;
  40.   return -1;
  41. }
  42. static int my_readlink(fsdir_t *f, const char *path, char *buf, size_t bufsiz)
  43. {
  44.   get_local(f,path,local,sizeof(local));
  45.   if(!strcmp(local,"/foobar")) {
  46.     sstrncpy(buf,"/u2/staff/flood",bufsiz);
  47.     return strlen(buf);
  48.   }
  49.   errno = ENOENT;
  50.   return -1;
  51. }
  52. static int my_lstat(fsdir_t *f, const char *path, struct stat *sbuf)
  53. {
  54.   get_local(f,path,local,sizeof(local));
  55.   if(!strcmp(local,"/")) {
  56.     bzero(sbuf,sizeof(struct stat));
  57.     sbuf->st_ino = 666;
  58.     sbuf->st_mode = 0755 | S_IFDIR;
  59.     sbuf->st_nlink = 3;
  60.     sbuf->st_uid = 0;
  61.     sbuf->st_gid = 0;
  62.     sbuf->st_size = 0;
  63.     sbuf->st_blksize = 0;
  64.     sbuf->st_blocks = 0;
  65.     time(&sbuf->st_atime);
  66.     time(&sbuf->st_mtime);
  67.     time(&sbuf->st_ctime);
  68.     return 0;
  69.   } else if(!strcmp(local,"/foobar")) {
  70.     bzero(sbuf,sizeof(struct stat));
  71.     sbuf->st_ino = 4523;
  72.     sbuf->st_mode = 0755 | S_IFLNK;
  73.     sbuf->st_nlink = 1;
  74.     sbuf->st_uid = 5;
  75.     sbuf->st_gid = 5;
  76.     sbuf->st_size = 4321;
  77.     sbuf->st_blksize = 1024;
  78.     sbuf->st_blocks = 5;
  79.     time(&sbuf->st_atime);
  80.     time(&sbuf->st_mtime);
  81.     time(&sbuf->st_ctime);
  82.     return 0;
  83.   } else if(!strcmp(local,"/buttmunch")) {
  84.     bzero(sbuf,sizeof(struct stat));
  85.     sbuf->st_ino = 6543;
  86.     sbuf->st_mode = 0755 | S_IFDIR;
  87.     sbuf->st_nlink = 1;
  88.     sbuf->st_uid = 6;
  89.     sbuf->st_gid = 6;
  90.     sbuf->st_size = 0;
  91.     sbuf->st_blksize = 1024;
  92.     sbuf->st_blocks = 0;
  93.     time(&sbuf->st_atime);
  94.     time(&sbuf->st_mtime);
  95.     time(&sbuf->st_ctime);
  96.     return 0;
  97.   } else if(!strncmp(local,"/buttmunch/",11)) {
  98.     char *cp = local+11;
  99.     sbuf->st_ino = atoi(cp);
  100.     sbuf->st_mode = 4755 | S_IFREG;
  101.     sbuf->st_uid = 0;
  102.     sbuf->st_gid = 0;
  103.     sbuf->st_size = atoi(cp);
  104.     sbuf->st_blksize = 1024;
  105.     sbuf->st_blocks = sbuf->st_size / 1024;
  106.     if(!sbuf->st_blocks)
  107.       sbuf->st_blocks++;
  108.     return 0;
  109.   }
  110.   errno = ENOENT;
  111.   return -1;
  112. }
  113. static int my_stat(fsdir_t *f, const char *path, struct stat *sbuf)
  114. {
  115.   if(my_lstat(f,path,sbuf) == -1)
  116.     return -1;
  117.   if(S_ISLNK(sbuf->st_mode)) {
  118.     char linkbuf[MAXPATHLEN];
  119.     if(my_readlink(f,path,linkbuf,sizeof(linkbuf)) == -1)
  120.       return -1;
  121.     return fs_stat(linkbuf,sbuf);
  122.   }
  123.   return 0;
  124. }
  125. static void *my_opendir(fsdir_t *f, const char *path)
  126. {
  127.   char *ptr,*cp,*tmp;
  128.   int i;
  129.   get_local(f,path,local,sizeof(local));
  130.   if(!strcmp(local,"/buttmunch")) {
  131.     testdir_t *dir;
  132.     dir = (testdir_t*)malloc(sizeof(testdir_t));
  133.     dir->path = strdup(local);
  134.     dir->nents = 5;
  135.     dir->curent = 0;
  136.     dir->ent[0] = "5678";
  137.     dir->ent[1] = "43215";
  138.     dir->ent[2] = "12578";
  139.     dir->ent[3] = "14";
  140.     dir->ent[4] = "56";
  141.     return dir;
  142.   }
  143.   errno = ENOENT;
  144.   return NULL;
  145. }
  146. static struct dirent *my_readdir(fsdir_t *f, void *_dir)
  147. {
  148.   testdir_t *dir = (testdir_t*)_dir;
  149.   int i;
  150.   i = dir->curent;
  151.   if(i + 1 == dir->nents) {
  152.     errno = 0;
  153.     return NULL;
  154.   }
  155.   dir->dirent.d_ino = atoi(dir->ent[i]);
  156.   dir->dirent.d_type = DT_REG;
  157.   sstrncpy(dir->dirent.d_name, dir->ent[i], NAME_MAX + 1);
  158.   dir->dirent.d_reclen = strlen(dir->dirent.d_name);
  159.   
  160.   dir->curent++;
  161.   return &dir->dirent;
  162. }
  163. static int my_closedir(fsdir_t *f, void *_dir)
  164. {
  165.   testdir_t *dir = (testdir_t*)_dir;
  166.   free(dir->path);
  167.   free(dir);
  168.   return 0;
  169. }
  170. static int notdir()
  171. { errno = ENOTDIR; return -1; }
  172. static int html_open(fsdir_t *f, const char *path, int flags)
  173. {
  174.   int ret;
  175.   ret = f->parent->open(f->parent,path,flags);
  176.   if(ret >= 0)
  177.     f->private = 0;
  178.   return ret;
  179. }
  180. static int html_close(fsdir_t *f, int fd)
  181. {
  182.   f->private = 0;
  183.   return f->parent->close(f->parent,fd);
  184. }
  185. static int html_read(fsdir_t *f, int fd, char *buf, size_t size)
  186. {
  187.   int ret;
  188.   char *cp,*ptr;
  189.   int intag = (int)f->private;
  190.   size_t len;
  191.   ret = f->parent->read(f,fd,buf,size);
  192.   if(ret >= 0) {
  193.     len = ret;
  194.     for(cp = buf, ptr = buf; len; len--, cp++) {
  195.       if(intag) {
  196.         if(*cp == '>')
  197.           intag--;
  198.         ret--;
  199.         continue;
  200.       } else {
  201.         if(*cp == '<') {
  202.           intag++;
  203.           ret--;
  204.           continue;
  205.         }
  206.         *ptr++ = *cp;
  207.       }
  208.     }
  209.     *ptr = '';
  210.     f->private = (void*)intag;
  211.   }
  212.   return ret;
  213. }
  214. static int html_write(fsdir_t *f, int fd, const char *buf, size_t size)
  215. { return f->parent->write(f,fd,buf,size); }
  216. static int html_hit(fsdir_t *f, const char *path, int op)
  217. {
  218.   fsdir_t *newfs;
  219.   struct stat sbuf;
  220.   char buf[MAXPATHLEN];
  221.   if(op == FSOP_OPEN) {
  222.     if(fs_resolve_path(path,buf,sizeof(buf)) == -1)
  223.       return -1;
  224.     if(fs_stat(buf,&sbuf) == -1)
  225.       return -1;
  226.     if(!S_ISREG(sbuf.st_mode))
  227.       return 0;
  228.     newfs = fs_register(buf);
  229.     newfs->chdir = (int(*)(fsdir_t*,const char*))&notdir;
  230.     newfs->open = &html_open;
  231.     newfs->close = &html_close;
  232.     newfs->read = &html_read;
  233.     newfs->write = &html_write;
  234.     return 1;
  235.   }
  236.   return 0;
  237. }
  238. static int test_init()
  239. {
  240.   fsmatch_t *fm;
  241.   fm = fs_register_match("*.htm*",FSOP_FILEMASK);
  242.   fm->dir_hit = fm->file_hit = html_hit;
  243.   return 0;
  244. }
  245. module test_module = {
  246.   NULL,NULL,
  247.   0x20,
  248.   "test",
  249.   NULL,
  250.   NULL,
  251.   NULL,
  252.   test_init,NULL
  253. };