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