16 DIR *opendir(char *dspec
)
18 static struct FAB
*dfab
;
22 if ((dfab
= (struct FAB
*)xmalloc(sizeof (struct FAB
))) == NULL
) {
23 printf("Error mallocing for FAB\n");
26 if ((dnam
= (struct NAM
*)xmalloc(sizeof (struct NAM
))) == NULL
) {
27 printf("Error mallocing for NAM\n");
31 if ((searchspec
= (char *)xmalloc(MAXNAMLEN
+1)) == NULL
) {
32 printf("Error mallocing for searchspec\n");
38 sprintf(searchspec
,"%s*.*;",dspec
);
41 dfab
->fab$l_fna
= searchspec
;
42 dfab
->fab$b_fns
= strlen(searchspec
);
43 dfab
->fab$l_nam
= dnam
;
46 dnam
->nam$l_esa
= searchspec
;
47 dnam
->nam$b_ess
= MAXNAMLEN
;
49 if (!(sys$
parse(dfab
) & 1)) {
60 #define uppercasify(str) { char *tmp; for(tmp = (str); *tmp != '\0'; tmp++) if(islower(*tmp)) *tmp = toupper(*tmp); }
62 struct direct
*readdir(DIR *dfd
)
64 static struct direct
*dentry
;
65 static char resultspec
[MAXNAMLEN
+1];
68 if ((dentry
= (struct direct
*)xmalloc(sizeof (struct direct
))) == NULL
) {
69 printf("Error mallocing for direct\n");
73 dfd
->fab$l_nam
->nam$l_rsa
= resultspec
;
74 dfd
->fab$l_nam
->nam$b_rss
= MAXNAMLEN
;
79 if (!((i
= sys$
search(dfd
)) & 1)) {
81 printf("sys$search failed with %d\n", i
);
87 if (dfd
->fab$l_nam
->nam$w_fid
== 0)
89 else dentry
->d_fileno
= dfd
->fab$l_nam
->nam$w_fid
[0]
90 +dfd
->fab$l_nam
->nam$w_fid
[1]<<16;
91 dentry
->d_reclen
= sizeof (struct direct
);
93 if (!strcmp(dfd->fab$l_nam->nam$l_type,".DIR"))
94 dentry->d_namlen = dfd->fab$l_nam->nam$b_name;
97 dentry
->d_namlen
= dfd
->fab$l_nam
->nam$b_name
+dfd
->fab$l_nam
->nam$b_type
;
98 strncpy(dentry
->d_name
,dfd
->fab$l_nam
->nam$l_name
,dentry
->d_namlen
);
99 dentry
->d_name
[dentry
->d_namlen
] = '\0';
100 uppercasify(dentry
->d_name
);
101 /* uvUnFixRCSSeparator(dentry->d_name);*/
109 if (dfd
->fab$l_nam
!= NULL
)
110 free(dfd
->fab$l_nam
->nam$l_esa
);
111 free(dfd
->fab$l_nam
);
116 char *getwd(char *cwd
)
118 static char buf
[512];
121 return(getcwd(cwd
,512));
123 return(getcwd(buf
,512));
134 static struct FAB Fab
;
135 static struct NAM Nam
;
136 static struct fibdef Fib
; /* short fib */
137 static struct dsc$descriptor FibDesc
=
138 {sizeof(Fib
), DSC$K_DTYPE_Z
, DSC$K_CLASS_S
, (char *)&Fib
};
139 static struct dsc$descriptor_s DevDesc
=
140 {0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, &Nam
.nam$t_dvi
[1]};
141 static char EName
[NAM$C_MAXRSS
];
142 static char RName
[NAM$C_MAXRSS
];
143 static struct dsc$descriptor_s FileName
=
144 {0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, 0};
145 static struct dsc$descriptor_s string
=
146 {0, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, 0};
147 static unsigned long Rdate
[2];
148 static unsigned long Cdate
[2];
149 static struct atrdef Atr
[] = {
150 {sizeof(Rdate
),ATR$C_REVDATE
,&Rdate
[0]}, /* Revision date */
151 {sizeof(Cdate
),ATR$C_CREDATE
,&Cdate
[0]}, /* Creation date */
154 static short int DevChan
;
155 static short int iosb
[4];
157 name
= vmsify (name
, 0);
159 /* initialize RMS structures, we need a NAM to retrieve the FID */
161 Fab
.fab$l_fna
= name
; /* name of file */
162 Fab
.fab$b_fns
= strlen(name
);
163 Fab
.fab$l_nam
= &Nam
; /* FAB has an associated NAM */
166 Nam
.nam$l_esa
= EName
; /* expanded filename */
167 Nam
.nam$b_ess
= sizeof(EName
);
168 Nam
.nam$l_rsa
= RName
; /* resultant filename */
169 Nam
.nam$b_rss
= sizeof(RName
);
171 /* do $PARSE and $SEARCH here */
172 status
= sys$
parse(&Fab
);
176 DevDesc
.dsc$w_length
= Nam
.nam$t_dvi
[0];
177 status
= sys$
assign(&DevDesc
,&DevChan
,0,0);
181 FileName
.dsc$a_pointer
= Nam
.nam$l_name
;
182 FileName
.dsc$w_length
= Nam
.nam$b_name
+Nam
.nam$b_type
+Nam
.nam$b_ver
;
184 /* Initialize the FIB */
188 Fib
.fib$w_fid
[i
]=Nam
.nam$w_fid
[i
];
189 Fib
.fib$w_did
[i
]=Nam
.nam$w_did
[i
];
191 Fib
.fib$r_fid_overlay
.fib$w_fid
[i
]=Nam
.nam$w_fid
[i
];
192 Fib
.fib$r_did_overlay
.fib$w_did
[i
]=Nam
.nam$w_did
[i
];
196 status
= sys$
qiow(0,DevChan
,IO$_ACCESS
,&iosb
,0,0,
197 &FibDesc
,&FileName
,0,0,&Atr
,0);
198 sys$
dassgn (DevChan
);
205 status
= stat (name
, buf
);
209 buf
->st_mtime
= ((Rdate
[0]>>24) & 0xff) + ((Rdate
[1]<<8) & 0xffffff00);
210 buf
->st_ctime
= ((Cdate
[0]>>24) & 0xff) + ((Cdate
[1]<<8) & 0xffffff00);
218 static long int date
[2];
220 static struct dsc$descriptor date_str
=
221 {26, DSC$K_DTYPE_T
, DSC$K_CLASS_S
, str
};
223 date
[0] = (tval
& 0xff) << 24;
224 date
[1] = ((tval
>>8) & 0xffffff);
226 if ((date
[0]==0) && (date
[1]==0))
229 sys$
asctim(0,&date_str
,date
,0);