You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
4.5 KiB
214 lines
4.5 KiB
/*
|
|
* DIRECTORY.C - VMS emulation routines for UNIX Directory
|
|
* callable routines
|
|
*
|
|
* Author: Patrick L. Mahan
|
|
* Location: TGV, Inc
|
|
* Date: 19-November-1991
|
|
*
|
|
* Purpose: Provides emulation of the BSD directory routines
|
|
* which are used by some of the X11 R4 release
|
|
* software.
|
|
*
|
|
* Side effects: This is only a partial emulation. Not all of
|
|
* the required information is passed to the user.
|
|
*
|
|
* Modification History
|
|
*
|
|
* Date | Who | Version | History
|
|
* ------------+-----------+---------------+----------------------------
|
|
* 19-Nov-1991 | PLM | 1.0 | First Write
|
|
* 20-Apr-1992 | PLM | 1.1 | Added validation check for
|
|
* | | | for the directory
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <rmsdef.h>
|
|
#include <descrip.h>
|
|
#include <lib$routines.h>
|
|
#include "vms_dirent.h"
|
|
|
|
#define NOWILD 0x00000001
|
|
#define MULTIPLE 0x00000002
|
|
|
|
static unsigned long context = 0;
|
|
|
|
static struct dsc$descriptor_s *create_descriptor ( name )
|
|
char *name;
|
|
{
|
|
struct dsc$descriptor_s *retdescrip;
|
|
|
|
retdescrip = (struct dsc$descriptor_s *)calloc(1, sizeof(struct dsc$descriptor_s));
|
|
|
|
if (retdescrip == NULL) return ((struct dsc$descriptor_s *)NULL);
|
|
|
|
retdescrip->dsc$b_dtype = DSC$K_DTYPE_T;
|
|
retdescrip->dsc$b_class = DSC$K_CLASS_S;
|
|
retdescrip->dsc$w_length = strlen(name);
|
|
retdescrip->dsc$a_pointer = name;
|
|
|
|
return (retdescrip);
|
|
}
|
|
|
|
static int Check_Directory( dirname )
|
|
char *dirname;
|
|
{
|
|
static char *tmpdir, *cp;
|
|
FILE *tfp;
|
|
int status;
|
|
|
|
status = 1;
|
|
|
|
tmpdir = calloc(strlen(dirname)+15,sizeof(char));
|
|
|
|
strcpy(tmpdir, dirname);
|
|
|
|
cp = strrchr(tmpdir, '.');
|
|
|
|
if (cp != NULL) {
|
|
*cp = ']';
|
|
cp = strrchr(tmpdir, ']');
|
|
*cp = '.';
|
|
strcat(tmpdir, "dir");
|
|
}
|
|
else {
|
|
char *tmp1;
|
|
tmp1 = calloc(strlen(dirname)+1,sizeof(char));
|
|
cp = strchr(tmpdir, '[');
|
|
cp++;
|
|
strcpy(tmp1, cp);
|
|
cp = strrchr(tmp1, ']');
|
|
*cp = '\0';
|
|
cp = strchr(tmpdir, '[');
|
|
cp++;
|
|
*cp = '\0';
|
|
strcat(tmpdir, "000000]");
|
|
strcat(tmpdir, tmp1);
|
|
strcat(tmpdir, ".dir");
|
|
}
|
|
|
|
tfp = fopen(tmpdir, "r");
|
|
|
|
if (tfp == NULL) status = 0;
|
|
|
|
fclose(tfp);
|
|
|
|
return (status);
|
|
}
|
|
|
|
DIR *opendir( dirname )
|
|
char *dirname;
|
|
{
|
|
DIR *retdir;
|
|
struct dsc$descriptor_s filedescriptor;
|
|
char *filepathname;
|
|
|
|
retdir = (DIR *) calloc(1, sizeof(DIR));
|
|
|
|
if (retdir == NULL) return ((DIR *)NULL);
|
|
|
|
if (!Check_Directory(dirname)) return ((DIR *)NULL);
|
|
|
|
filepathname = (char *)calloc(256, sizeof(char));
|
|
|
|
strcpy(filepathname, dirname);
|
|
strcat(filepathname, "*.*.*");
|
|
|
|
retdir->dd_fd = (unsigned long) create_descriptor(filepathname);
|
|
retdir->dd_loc = 0;
|
|
retdir->dd_size = strlen(filepathname);
|
|
retdir->dd_bsize = 0;
|
|
retdir->dd_off = 0;
|
|
retdir->dd_buf = filepathname;
|
|
|
|
return (retdir);
|
|
}
|
|
|
|
struct dirent *readdir( dirp )
|
|
DIR *dirp;
|
|
{
|
|
static struct dirent *retdirent;
|
|
struct dsc$descriptor_s retfilenamedesc;
|
|
struct dsc$descriptor_s searchpathdesc = *((struct dsc$descriptor_s *)dirp->dd_fd);
|
|
char retfilename[256];
|
|
char *sp;
|
|
unsigned long istatus;
|
|
unsigned long rms_status;
|
|
unsigned long flags;
|
|
|
|
retdirent = (struct dirent *)NULL;
|
|
|
|
flags = MULTIPLE;
|
|
|
|
retfilenamedesc.dsc$b_dtype = DSC$K_DTYPE_T;
|
|
retfilenamedesc.dsc$b_class = DSC$K_CLASS_S;
|
|
retfilenamedesc.dsc$w_length = 255;
|
|
retfilenamedesc.dsc$a_pointer= retfilename;
|
|
|
|
istatus = lib$find_file (&searchpathdesc,
|
|
&retfilenamedesc,
|
|
&dirp->dd_loc,
|
|
0, 0,
|
|
&rms_status,
|
|
&flags);
|
|
|
|
if (!(istatus & 1) && (istatus != RMS$_NMF) && (istatus != RMS$_FNF))
|
|
{
|
|
lib$signal (istatus);
|
|
return (retdirent);
|
|
}
|
|
else if ((istatus == RMS$_NMF) || (istatus == RMS$_FNF))
|
|
return (retdirent);
|
|
|
|
retfilename[retfilenamedesc.dsc$w_length] = '\0';
|
|
|
|
sp = strchr(retfilename, ' ');
|
|
if (sp != NULL) *sp = '\0';
|
|
|
|
sp = strrchr(retfilename, ']');
|
|
if (sp != NULL)
|
|
sp++;
|
|
else
|
|
sp = retfilename;
|
|
|
|
retdirent = (struct dirent *)calloc(1, sizeof(struct dirent));
|
|
|
|
strcpy(retdirent->d_name, sp);
|
|
retdirent->d_namlen = strlen(sp);
|
|
retdirent->d_fileno = 0;
|
|
retdirent->d_off = 0;
|
|
retdirent->d_reclen = DIRSIZ(retdirent);
|
|
|
|
return (retdirent);
|
|
}
|
|
|
|
long telldir( dirp )
|
|
DIR *dirp;
|
|
{
|
|
return(0);
|
|
}
|
|
|
|
void seekdir( dirp, loc )
|
|
DIR *dirp;
|
|
int loc;
|
|
{
|
|
return;
|
|
}
|
|
|
|
void rewinddir( dirp )
|
|
DIR *dirp;
|
|
{
|
|
lib$find_file_end (&dirp->dd_loc);
|
|
}
|
|
|
|
void closedir( dirp )
|
|
DIR *dirp;
|
|
{
|
|
lib$find_file_end (&dirp->dd_loc);
|
|
|
|
cfree ((void *) dirp->dd_fd);
|
|
cfree (dirp->dd_buf);
|
|
cfree (dirp);
|
|
}
|
|
|