#define KDEBUG 0 /* vmsfunctions.c */ #include #include "make.h" #ifdef __DECC #include #endif #include #include #include #include #include #include "vmsdir.h" DIR *opendir(char *dspec) { static struct FAB *dfab; struct NAM *dnam; char *searchspec; if ((dfab = (struct FAB *)xmalloc(sizeof (struct FAB))) == NULL) { printf("Error mallocing for FAB\n"); return(NULL); } if ((dnam = (struct NAM *)xmalloc(sizeof (struct NAM))) == NULL) { printf("Error mallocing for NAM\n"); free(dfab); return(NULL); } if ((searchspec = (char *)xmalloc(MAXNAMLEN+1)) == NULL) { printf("Error mallocing for searchspec\n"); free(dfab); free(dnam); return(NULL); } sprintf(searchspec,"%s*.*;",dspec); *dfab = cc$rms_fab; dfab->fab$l_fna = searchspec; dfab->fab$b_fns = strlen(searchspec); dfab->fab$l_nam = dnam; *dnam = cc$rms_nam; dnam->nam$l_esa = searchspec; dnam->nam$b_ess = MAXNAMLEN; if (!(sys$parse(dfab) & 1)) { free(dfab); free(dnam); free(searchspec); return(NULL); } return(dfab); } #include #define uppercasify(str) { char *tmp; for(tmp = (str); *tmp != '\0'; tmp++) if(islower(*tmp)) *tmp = toupper(*tmp); } struct direct *readdir(DIR *dfd) { static struct direct *dentry; static char resultspec[MAXNAMLEN+1]; int i; if ((dentry = (struct direct *)xmalloc(sizeof (struct direct))) == NULL) { printf("Error mallocing for direct\n"); return(NULL); } dfd->fab$l_nam->nam$l_rsa = resultspec; dfd->fab$l_nam->nam$b_rss = MAXNAMLEN; if (debug_flag) printf("."); if (!((i = sys$search(dfd)) & 1)) { if (debug_flag) printf("sys$search failed with %d\n", i); free(dentry); return(NULL); } dentry->d_off = 0; if (dfd->fab$l_nam->nam$w_fid == 0) dentry->d_fileno = 1; else dentry->d_fileno = dfd->fab$l_nam->nam$w_fid[0] +dfd->fab$l_nam->nam$w_fid[1]<<16; dentry->d_reclen = sizeof (struct direct); /* if (!strcmp(dfd->fab$l_nam->nam$l_type,".DIR")) dentry->d_namlen = dfd->fab$l_nam->nam$b_name; else */ dentry->d_namlen = dfd->fab$l_nam->nam$b_name+dfd->fab$l_nam->nam$b_type; strncpy(dentry->d_name,dfd->fab$l_nam->nam$l_name,dentry->d_namlen); dentry->d_name[dentry->d_namlen] = '\0'; uppercasify(dentry->d_name); /* uvUnFixRCSSeparator(dentry->d_name);*/ return(dentry); } closedir(DIR *dfd) { if (dfd != NULL) { if (dfd->fab$l_nam != NULL) free(dfd->fab$l_nam->nam$l_esa); free(dfd->fab$l_nam); free(dfd); } } char *getwd(char *cwd) { static char buf[512]; if (cwd) return(getcwd(cwd,512)); else return(getcwd(buf,512)); } int vms_stat (name, buf) char *name; struct stat *buf; { int status; int i; static struct FAB Fab; static struct NAM Nam; static struct fibdef Fib; /* short fib */ static struct dsc$descriptor FibDesc = {sizeof(Fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (char *)&Fib}; static struct dsc$descriptor_s DevDesc = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &Nam.nam$t_dvi[1]}; static char EName[NAM$C_MAXRSS]; static char RName[NAM$C_MAXRSS]; static struct dsc$descriptor_s FileName = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0}; static struct dsc$descriptor_s string = {0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0}; static unsigned long Rdate[2]; static unsigned long Cdate[2]; static struct atrdef Atr[] = { {sizeof(Rdate),ATR$C_REVDATE,&Rdate[0]}, /* Revision date */ {sizeof(Cdate),ATR$C_CREDATE,&Cdate[0]}, /* Creation date */ {0,0,0} }; static short int DevChan; static short int iosb[4]; name = vmsify (name, 0); /* initialize RMS structures, we need a NAM to retrieve the FID */ Fab = cc$rms_fab; Fab.fab$l_fna = name ; /* name of file */ Fab.fab$b_fns = strlen(name); Fab.fab$l_nam = &Nam; /* FAB has an associated NAM */ Nam = cc$rms_nam; Nam.nam$l_esa = EName; /* expanded filename */ Nam.nam$b_ess = sizeof(EName); Nam.nam$l_rsa = RName; /* resultant filename */ Nam.nam$b_rss = sizeof(RName); /* do $PARSE and $SEARCH here */ status = sys$parse(&Fab); if (!(status & 1)) return -1; DevDesc.dsc$w_length = Nam.nam$t_dvi[0]; status = sys$assign(&DevDesc,&DevChan,0,0); if (!(status & 1)) return -1; FileName.dsc$a_pointer = Nam.nam$l_name; FileName.dsc$w_length = Nam.nam$b_name+Nam.nam$b_type+Nam.nam$b_ver; /* Initialize the FIB */ for (i=0;i<3;i++) { #if __DECC Fib.fib$w_fid[i]=Nam.nam$w_fid[i]; Fib.fib$w_did[i]=Nam.nam$w_did[i]; #else Fib.fib$r_fid_overlay.fib$w_fid[i]=Nam.nam$w_fid[i]; Fib.fib$r_did_overlay.fib$w_did[i]=Nam.nam$w_did[i]; #endif } status = sys$qiow(0,DevChan,IO$_ACCESS,&iosb,0,0, &FibDesc,&FileName,0,0,&Atr,0); sys$dassgn (DevChan); if (!(status & 1)) return -1; status = iosb[0]; if (!(status & 1)) return -1; status = stat (name, buf); if (status) return -1; buf->st_mtime = ((Rdate[0]>>24) & 0xff) + ((Rdate[1]<<8) & 0xffffff00); buf->st_ctime = ((Cdate[0]>>24) & 0xff) + ((Cdate[1]<<8) & 0xffffff00); return 0; } char * cvt_time(tval) unsigned long tval; { static long int date[2]; static char str[27]; static struct dsc$descriptor date_str = {26, DSC$K_DTYPE_T, DSC$K_CLASS_S, str}; date[0] = (tval & 0xff) << 24; date[1] = ((tval>>8) & 0xffffff); if ((date[0]==0) && (date[1]==0)) return("never"); sys$asctim(0,&date_str,date,0); str[26]='\0'; return(str); } /* EOF */