mirror of
https://git.savannah.gnu.org/git/make.git
synced 2024-11-25 04:35:44 +00:00
37fbc32ba4
* vmsfunctions.c (vms_stat): `sys$dassgn (DevChan);' added by kkaempf.
235 lines
5.5 KiB
C
235 lines
5.5 KiB
C
#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);
|
|
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 */
|