dirent.c
上传用户:zlh9724
上传日期:2007-01-04
资源大小:1991k
文件大小:4k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /* file changed to make it VMS compatible. NOT ALL UNIX FEATURES WORK */
  2. #include <ssdef.h>
  3. #include <rmsdef.h>
  4. #include "dirent.h"
  5. /* routines are not reentrant... */
  6. #define NO_VERSIONS
  7. DIR *opendir(char *dirname)
  8. {
  9. static DIR dir;
  10. char *closebracket;
  11. long status;
  12. struct dsc$descriptor_s entryname_desc;
  13. struct dsc$descriptor_s dirname_desc;
  14. char DirEntry[256];
  15. char VMSentry[256];
  16. char UnixEntry[256];
  17. int index;
  18. char *dot;
  19.    /* check if directory exists */
  20.    /* dirname can look like /disk$user/duns/www/test/multi    */
  21.    /* or like               /disk$user/duns/www/test/multi/   */
  22.    /* DirEntry should look like     disk$user:[duns.www.test]multi in both cases */
  23.    /* dir.dirname should look like  disk$user:[duns.www.test.multi] */
  24.    strcpy(UnixEntry,dirname);
  25.    if (UnixEntry[strlen(UnixEntry)-1] != '/')
  26.       strcat(UnixEntry,"/");
  27.    strcpy(DirEntry, HTVMS_name("",UnixEntry));
  28.    strcpy(dir.dirname, DirEntry);
  29.    index = strlen(DirEntry) - 1;
  30.    if (DirEntry[index] == ']')
  31.       DirEntry[index] = '';
  32.    if ((dot = strrchr(DirEntry,'.')) == NULL)
  33.    {  /* convert disk$user:[duns] into disk$user:[000000]duns.dir */
  34.       char *openbr = strrchr(DirEntry,'[');
  35.       if (!openbr)
  36.       { /* convert disk$user: into disk$user:[000000]000000.dir */
  37.          strcpy(dir.dirname, DirEntry);
  38.          strcat(dir.dirname, "[000000]");
  39.          strcat(DirEntry,"[000000]000000.dir");
  40.       }
  41.       else
  42.       {
  43.          char End[256];
  44.          strcpy(End,openbr+1);
  45.          *(openbr+1) = '';
  46.          strcat(DirEntry,"000000]");
  47.          strcat(DirEntry,End);
  48.          strcat(DirEntry,".dir");
  49.       }
  50.    }
  51.    else
  52.    {
  53.       *dot = ']';   
  54.       strcat(DirEntry,".dir");
  55.    }
  56.    dir.context = 0;
  57.    dirname_desc.dsc$w_length = strlen(DirEntry);
  58.    dirname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
  59.    dirname_desc.dsc$b_class = DSC$K_CLASS_S;
  60.    dirname_desc.dsc$a_pointer = &(DirEntry);
  61.    /* look for the directory */
  62.    entryname_desc.dsc$w_length = 255;
  63.    entryname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
  64.    entryname_desc.dsc$b_class = DSC$K_CLASS_S;
  65.    entryname_desc.dsc$a_pointer = VMSentry;
  66.    status = LIB$FIND_FILE(&(dirname_desc), 
  67.                           &entryname_desc, 
  68.                           &(dir.context),
  69.                           0,0,0);
  70.    if (!(status & 0x01))
  71.    { /* directory not found */
  72.       return(NULL);
  73.    }
  74. #if 0
  75.    /* now correct dirname, which looks like disk$user:[duns.www.test]multi */
  76.    /* and should look like disk$user:[duns.www.test.multi] */
  77.    closebracket = strchr(dir.dirname,']');
  78.    *closebracket = '.';
  79.    closebracket = strstr(dir.dirname,".dir");
  80.    *closebracket = '';
  81.    strcat(dir.dirname,"]");
  82. #endif
  83. #ifdef NO_VERSIONS
  84.    strcat(dir.dirname,"*.*");
  85. #else
  86.    strcat(dir.dirname,"*.*;*");
  87. #endif
  88.    dir.context = 0;
  89.    dir.dirname_desc.dsc$w_length = strlen(dir.dirname);
  90.    dir.dirname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
  91.    dir.dirname_desc.dsc$b_class = DSC$K_CLASS_S;
  92.    dir.dirname_desc.dsc$a_pointer = &(dir.dirname);
  93.    return(&dir);
  94. }
  95. struct dirent *readdir(DIR *dirp)
  96. {
  97. static struct dirent entry;
  98. long status;
  99. struct dsc$descriptor_s entryname_desc;
  100. char *space, *slash;
  101. char VMSentry[256];
  102. char *UnixEntry;
  103.    entryname_desc.dsc$w_length = 255;
  104.    entryname_desc.dsc$b_dtype = DSC$K_DTYPE_T;
  105.    entryname_desc.dsc$b_class = DSC$K_CLASS_S;
  106.    entryname_desc.dsc$a_pointer = VMSentry;
  107.    status = LIB$FIND_FILE(&(dirp->dirname_desc), 
  108.                           &entryname_desc, 
  109.                           &(dirp->context),
  110.                           0,0,0);
  111.    if (status == RMS$_NMF)
  112.    { /* no more files */
  113.       return(NULL);
  114.    }
  115.    else
  116.    { /* ok */
  117.       if (!(status & 0x01)) return(0);
  118. #ifdef NO_VERSIONS
  119.       space = strchr(VMSentry,';');
  120. #else
  121.       space = strchr(VMSentry,' ');
  122. #endif
  123.       if (space)
  124.          *space = '';
  125.       /* convert to unix style... */
  126.       UnixEntry = HTVMS_wwwName(VMSentry);
  127.       slash = strrchr(UnixEntry,'/') + 1;
  128.       strcpy(entry.d_name,slash);
  129.       entry.d_namlen = strlen(entry.d_name);
  130.       entry.d_fileno = 1;
  131.       return(&entry);
  132.    }
  133. }
  134. int closedir(DIR *dirp)
  135. {
  136. long status;
  137.    status = LIB$FIND_FILE_END(&(dirp->context));
  138.    if (!(status & 0x01)) exit(status);
  139.    dirp->context = 0;
  140.    return(0);
  141. }
  142. /* rest of routines not implemented */
  143. #if 0
  144. #ifndef _POSIX_SOURCE
  145. extern void seekdir(/* DIR *dirp, int loc */);
  146. extern long telldir(/* DIR *dirp */);
  147. #endif /* POSIX_SOURCE */
  148. extern void rewinddir(/* DIR *dirp */);
  149. #ifndef lint
  150. #define rewinddir(dirp) seekdir((dirp), (long)0)
  151. #endif /* not implemented */
  152. #endif /* not defined for VMS */