diff options
Diffstat (limited to 'vmsfunctions.c')
-rw-r--r-- | vmsfunctions.c | 234 |
1 files changed, 234 insertions, 0 deletions
diff --git a/vmsfunctions.c b/vmsfunctions.c new file mode 100644 index 0000000..a76609c --- /dev/null +++ b/vmsfunctions.c @@ -0,0 +1,234 @@ +#define KDEBUG 0 +/* vmsfunctions.c */ + +#include <stdio.h> +#include "make.h" +#ifdef __DECC +#include <starlet.h> +#endif +#include <descrip.h> +#include <rms.h> +#include <iodef.h> +#include <atrdef.h> +#include <fibdef.h> +#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 <ctype.h> +#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); + 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 */ |