summaryrefslogtreecommitdiff
path: root/vmsfunctions.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>1996-03-20 14:57:41 +0000
committerRoland McGrath <roland@redhat.com>1996-03-20 14:57:41 +0000
commit9e443adaf679b071fb3319cfc3259e322dcb6e57 (patch)
treea84a507d09be97fb0932bb661139921a59db71bd /vmsfunctions.c
parentdfefc77263fe835ae12b3ee27cc3ed9b084311c1 (diff)
downloadgunmake-9e443adaf679b071fb3319cfc3259e322dcb6e57.tar.gz
Tue Mar 19 20:21:34 1996 Roland McGrath <roland@charlie-brown.gnu.ai.mit.edu>
Merged VMS port from Klaus Kaempf <kkaempf@didymus.rmi.de>. * make.h (PARAMS): New macro. * config.h-vms: New file. * makefile.com: New file. * makefile.vms: New file. * readme.vms: New file. * vmsdir.h: New file. * vmsfunctions.c: New file. * vmsify.c: New file. * file.h: Renamed to filedef.h to avoid conflict with VMS system hdr. * ar.c: Added prototypes and changes for VMS. * commands.c: Likewise. * commands.h: Likewise. * default.c: Likewise. * dep.h: Likewise. * dir.c: Likewise. * expand.c: Likewise. * file.c: Likewise. * function.c: Likewise. * implicit.c: Likewise. * job.c: Likewise. * job.h: Likewise. * main.c: Likewise. * make.h: Likewise. * misc.c: Likewise. * read.c: Likewise. * remake.c: Likewise. * remote-stub.c: Likewise. * rule.c: Likewise. * rule.h: Likewise. * variable.c: Likewise. * variable.h: Likewise. * vpath.c: Likewise. * compatMakefile (srcs): Rename file.h to filedef.h.
Diffstat (limited to 'vmsfunctions.c')
-rw-r--r--vmsfunctions.c234
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 */