mirror of
https://github.com/Interlisp/maiko.git
synced 2026-03-06 11:03:29 +00:00
Merge pull request #533 from Interlisp/nhb-rewrite-version-parser-v2
Extensive rewrite of various parts of the file name/version handling code. Converts a lot of unsafe string handling functions to safer variants. Passes buffer sizes in various places to enable overflow checks. Removes some unused variable declarations. Updates comments. Improves performance with alarm timeout setting when sequences of alarm set/cancel operations are performed. Adds GETFILEINFO processing for INODE_LO and INODE_HI attributes.
This commit is contained in:
@@ -364,7 +364,6 @@ SET(MAIKO_HDRS
|
||||
inc/lispemul.h
|
||||
inc/lispmap.h
|
||||
inc/lispver1.h
|
||||
inc/lispver2.h
|
||||
inc/llcolordefs.h
|
||||
inc/lldsp.h
|
||||
inc/llstkdefs.h
|
||||
|
||||
@@ -18,7 +18,7 @@ SRCFILES = conspage.c gcoflow.c shift.c dbgtool.c gcr.c gcrcell.c llstk.
|
||||
OFILES = conspage.obj gcoflow.obj shift.obj dbgtool.obj gcr.obj gcrcell.obj llstk.obj gcscan.obj loopsops.obj storage.obj allocmds.obj dir.obj gvar2.obj lowlev1.obj subr.obj arithops.obj lowlev2.obj subr0374.obj doscomm.obj hardrtn.obj lsthandl.obj sxhash.obj draw.obj main.obj testtool.obj array.obj dsk.obj inet.obj misc7.obj timer.obj array2.obj dspif.obj initdsp.obj miscn.obj typeof.obj array3.obj initkbd.obj ubf1.obj array4.obj dspsubrs.obj initsout.obj mkatom.obj ubf2.obj array5.obj eqf.obj intcall.obj mkcell.obj ubf3.obj array6.obj ether.obj ufn.obj atom.obj findkey.obj kbdsubrs.obj mouseif.obj ufs.obj bbtsub.obj foreign.obj keyevent.obj unixcomm.obj bin.obj fp.obj binds.obj fvar.obj mvs.obj unwind.obj bitblt.obj gc.obj uraid.obj blt.obj gc2.obj kprint.obj osmsg.obj usrsubr.obj byteswap.obj gcarray.obj perrno.obj uutils.obj carcdr.obj asmbbt.obj gccode.obj vars3.obj gcfinal.obj ldsout.obj return.obj vmemsave.obj chardev.obj gchtfind.obj lineblt8.obj rpc.obj xc.obj common.obj gcmain3.obj lisp2c.obj rplcons.obj z2.obj vdate.obj $(COLORFILES) $(ARCHFILES) $(LPFILES)
|
||||
|
||||
|
||||
HFILES = address.h adr68k.h arithopsdefs.h arith.h cell.h dbprint.h display.h dspif.h ifpage.h iopage.h lispemul.h lispmap.h lsptypes.h miscstat.h lspglob.h array.h bb.h bbtmacro.h debug.h devconf.h dspdata.h fast_dsp.h gcdata.h initatms.h inlinec.h keyboard.h lispver1.h lispver2.h lldsp.h locfile.h medleyfp.h mouseif.h my.h opcodes.h osmsgprint.h pilotbbt.h print.h retmacro.h stack.h stream.h subrs.h timeout.h tos1defs.h tosfns.h tosret.h xdefs.h xbitmaps.h xkeymap.h
|
||||
HFILES = address.h adr68k.h arithopsdefs.h arith.h cell.h dbprint.h display.h dspif.h ifpage.h iopage.h lispemul.h lispmap.h lsptypes.h miscstat.h lspglob.h array.h bb.h bbtmacro.h debug.h devconf.h dspdata.h fast_dsp.h gcdata.h initatms.h inlinec.h keyboard.h lispver1.h lldsp.h locfile.h medleyfp.h mouseif.h my.h opcodes.h osmsgprint.h pilotbbt.h print.h retmacro.h stack.h stream.h subrs.h timeout.h tos1defs.h tosfns.h tosret.h xdefs.h xbitmaps.h xkeymap.h
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -340,7 +340,7 @@ $(OBJECTDIR)car-cdr.o: $(SRCDIR)car-cdr.c $(REQUIRED-INCS) \
|
||||
$(OBJECTDIR)chardev.o: $(SRCDIR)chardev.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)adr68k.h $(INCDIR)lsptypes.h $(INCDIR)arith.h $(INCDIR)timeout.h \
|
||||
$(INCDIR)locfile.h $(INCDIR)lispver2.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)locfile.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)chardevdefs.h $(INCDIR)byteswapdefs.h $(INCDIR)commondefs.h \
|
||||
$(INCDIR)perrnodefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)chardev.c -o $(OBJECTDIR)chardev.o
|
||||
@@ -505,7 +505,7 @@ $(OBJECTDIR)dsk.o: $(SRCDIR)dsk.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)adr68k.h $(INCDIR)lsptypes.h $(INCDIR)lspglob.h $(INCDIR)ifpage.h \
|
||||
$(INCDIR)iopage.h $(INCDIR)miscstat.h $(INCDIR)arith.h $(INCDIR)stream.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)locfile.h $(INCDIR)lispver2.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)locfile.h \
|
||||
$(INCDIR)dbprint.h $(INCDIR)dskdefs.h $(INCDIR)byteswapdefs.h \
|
||||
$(INCDIR)car-cdrdefs.h $(INCDIR)cell.h $(INCDIR)commondefs.h \
|
||||
$(INCDIR)ufsdefs.h
|
||||
@@ -515,7 +515,7 @@ $(OBJECTDIR)ufs.o: $(SRCDIR)ufs.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)adr68k.h $(INCDIR)lsptypes.h $(INCDIR)lspglob.h $(INCDIR)ifpage.h \
|
||||
$(INCDIR)iopage.h $(INCDIR)miscstat.h $(INCDIR)arith.h $(INCDIR)stream.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)locfile.h $(INCDIR)lispver2.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)locfile.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)ufsdefs.h $(INCDIR)commondefs.h $(INCDIR)dskdefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)ufs.c -o $(OBJECTDIR)ufs.o
|
||||
|
||||
@@ -523,7 +523,7 @@ $(OBJECTDIR)dir.o: $(SRCDIR)dir.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)adr68k.h $(INCDIR)lsptypes.h $(INCDIR)arith.h $(INCDIR)lspglob.h \
|
||||
$(INCDIR)ifpage.h $(INCDIR)iopage.h $(INCDIR)miscstat.h $(INCDIR)timeout.h \
|
||||
$(INCDIR)locfile.h $(INCDIR)lispver2.h $(INCDIR)dirdefs.h \
|
||||
$(INCDIR)locfile.h $(INCDIR)dirdefs.h \
|
||||
$(INCDIR)commondefs.h $(INCDIR)dskdefs.h $(INCDIR)ufsdefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)dir.c -o $(OBJECTDIR)dir.o
|
||||
|
||||
@@ -640,7 +640,7 @@ $(OBJECTDIR)inet.o: $(SRCDIR)inet.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)lsptypes.h $(INCDIR)arith.h $(INCDIR)emlglob.h $(INCDIR)lspglob.h \
|
||||
$(INCDIR)ifpage.h $(INCDIR)iopage.h $(INCDIR)miscstat.h $(INCDIR)adr68k.h \
|
||||
$(INCDIR)dbprint.h $(INCDIR)locfile.h $(INCDIR)lispver2.h \
|
||||
$(INCDIR)dbprint.h $(INCDIR)locfile.h \
|
||||
$(INCDIR)inetdefs.h $(INCDIR)byteswapdefs.h $(INCDIR)commondefs.h \
|
||||
$(INCDIR)mkcelldefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)inet.c -o $(OBJECTDIR)inet.o
|
||||
@@ -758,7 +758,7 @@ $(OBJECTDIR)osmsg.o: $(SRCDIR)osmsg.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)adr68k.h $(INCDIR)lsptypes.h $(INCDIR)arith.h $(INCDIR)stream.h \
|
||||
$(INCDIR)lspglob.h $(INCDIR)ifpage.h $(INCDIR)iopage.h $(INCDIR)miscstat.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)locfile.h $(INCDIR)lispver2.h $(INCDIR)osmsgprint.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)locfile.h $(INCDIR)osmsgprint.h \
|
||||
$(INCDIR)dbprint.h $(INCDIR)commondefs.h $(INCDIR)osmsgdefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)osmsg.c -o $(OBJECTDIR)osmsg.o
|
||||
|
||||
@@ -865,7 +865,7 @@ $(OBJECTDIR)unixcomm.o: $(SRCDIR)unixcomm.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lspglob.h $(INCDIR)ifpage.h $(INCDIR)iopage.h $(INCDIR)miscstat.h \
|
||||
$(INCDIR)cell.h $(INCDIR)stack.h $(INCDIR)arith.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)timeout.h $(INCDIR)unixcommdefs.h $(INCDIR)byteswapdefs.h \
|
||||
$(INCDIR)commondefs.h $(INCDIR)locfile.h $(INCDIR)lispver2.h
|
||||
$(INCDIR)commondefs.h $(INCDIR)locfile.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)unixcomm.c -o $(OBJECTDIR)unixcomm.o
|
||||
|
||||
$(OBJECTDIR)unixfork.o: $(SRCDIR)unixfork.c $(REQUIRED-INCS) \
|
||||
@@ -888,7 +888,7 @@ $(OBJECTDIR)rpc.o: $(SRCDIR)rpc.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h $(INCDIR)lispmap.h \
|
||||
$(INCDIR)lsptypes.h $(INCDIR)lspglob.h $(INCDIR)ifpage.h $(INCDIR)iopage.h \
|
||||
$(INCDIR)miscstat.h $(INCDIR)emlglob.h $(INCDIR)adr68k.h $(INCDIR)arith.h \
|
||||
$(INCDIR)locfile.h $(INCDIR)lispver2.h $(INCDIR)rpcdefs.h \
|
||||
$(INCDIR)locfile.h $(INCDIR)rpcdefs.h \
|
||||
$(INCDIR)commondefs.h
|
||||
$(CC) $(RFLAGS) $(SRCDIR)rpc.c -o $(OBJECTDIR)rpc.o
|
||||
|
||||
@@ -909,7 +909,7 @@ $(OBJECTDIR)vmemsave.o: $(SRCDIR)vmemsave.c $(REQUIRED-INCS) \
|
||||
$(INCDIR)lispemul.h \
|
||||
$(INCDIR)lispmap.h $(INCDIR)lspglob.h $(INCDIR)ifpage.h $(INCDIR)iopage.h \
|
||||
$(INCDIR)miscstat.h $(INCDIR)timeout.h $(INCDIR)adr68k.h \
|
||||
$(INCDIR)lsptypes.h $(INCDIR)locfile.h $(INCDIR)lispver2.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)lsptypes.h $(INCDIR)locfile.h $(INCDIR)dbprint.h \
|
||||
$(INCDIR)devif.h $(INCDIR)vmemsavedefs.h $(INCDIR)byteswapdefs.h $(INCDIR)commondefs.h \
|
||||
$(INCDIR)dskdefs.h $(INCDIR)initkbddefs.h $(INCDIR)perrnodefs.h \
|
||||
$(INCDIR)ufsdefs.h
|
||||
|
||||
@@ -58,7 +58,7 @@ typedef struct dfinfo {
|
||||
} DFINFO;
|
||||
|
||||
#ifdef DOS
|
||||
int make_old_version(char *old, char *file);
|
||||
int make_old_version(char *old, size_t oldsize, char *file);
|
||||
#endif
|
||||
#ifdef FSDEBUG
|
||||
void print_finfo(FINFO *fp);
|
||||
|
||||
@@ -19,7 +19,9 @@ LispPTR COM_writepage(LispPTR *args);
|
||||
LispPTR COM_truncatefile(LispPTR *args);
|
||||
LispPTR COM_changedir(LispPTR *args);
|
||||
LispPTR COM_getfreeblock(LispPTR *args);
|
||||
void separate_version(char *name, char *ver, int checkp);
|
||||
void conc_dir_and_name(char *dir, char *name, char *fname, size_t fname_size);
|
||||
void conc_name_and_version(char *name, char *ver, char *rname, size_t rname_size);
|
||||
void separate_version(char *name, size_t namesize, char *ver, size_t versize, int checkp);
|
||||
int unpack_filename(char *file, char *dir, char *name, char *ver, int checkp);
|
||||
int true_name(char *path);
|
||||
int true_name(char *path, size_t pathsize);
|
||||
#endif
|
||||
|
||||
@@ -1,74 +0,0 @@
|
||||
#ifndef LISPVER2_H
|
||||
#define LISPVER2_H 1
|
||||
/* $Id: lispver2.h,v 1.2 1999/01/03 02:06:09 sybalsky Exp $ (C) Copyright Venue, All Rights Reserved */
|
||||
|
||||
/* non-DOS version of LispVersionToUnixVersion */
|
||||
|
||||
#define LispVersionToUnixVersion(pathname) do { \
|
||||
\
|
||||
char *lv_cp; \
|
||||
char *lv_vp; \
|
||||
unsigned lv_ver; \
|
||||
char lv_ver_buf[VERSIONLEN]; \
|
||||
\
|
||||
lv_cp = pathname; \
|
||||
lv_vp = NULL; \
|
||||
while (*lv_cp) { \
|
||||
switch (*lv_cp) { \
|
||||
\
|
||||
case ';': \
|
||||
lv_vp = lv_cp; \
|
||||
lv_cp++; \
|
||||
break; \
|
||||
\
|
||||
case '\'': \
|
||||
if (*(lv_cp + 1) != 0) lv_cp += 2; \
|
||||
else lv_cp++; \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
lv_cp++; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (lv_vp != NULL) { \
|
||||
/* \
|
||||
* A semicolon which is not quoted has been found. \
|
||||
*/ \
|
||||
if (*(lv_vp + 1) == 0) { \
|
||||
/* \
|
||||
* The empty version field. \
|
||||
* This is regarded as a versionless file. \
|
||||
*/ \
|
||||
*lv_vp = 0; \
|
||||
} else { \
|
||||
NumericStringP((lv_vp + 1), YES, NO); \
|
||||
YES: \
|
||||
/* \
|
||||
* Convert the remaining field to digit. \
|
||||
*/ \
|
||||
lv_ver = strtoul(lv_vp + 1, (char **)NULL, 10); \
|
||||
if (lv_ver == 0) { \
|
||||
/* versionless */ \
|
||||
*lv_vp = 0; \
|
||||
} else { \
|
||||
sprintf(lv_ver_buf, ".~%u~", lv_ver); \
|
||||
*lv_vp = 0; \
|
||||
strcat(pathname, lv_ver_buf); \
|
||||
} \
|
||||
goto CONT; \
|
||||
\
|
||||
NO: \
|
||||
strcpy(lv_ver_buf, lv_vp + 1); \
|
||||
strcat(lv_ver_buf, "~"); \
|
||||
*lv_vp++ = '.'; \
|
||||
*lv_vp++ = '~'; \
|
||||
*lv_vp = 0; \
|
||||
strcat(pathname, lv_ver_buf); \
|
||||
CONT: \
|
||||
lv_vp--; /* Just for label */ \
|
||||
} \
|
||||
} \
|
||||
} while (0)
|
||||
#endif /* LISPVER2_H */
|
||||
174
inc/locfile.h
174
inc/locfile.h
@@ -35,6 +35,8 @@
|
||||
#define PROTECTION (S_POSITIVE | 6)
|
||||
#define EOL (S_POSITIVE | 7)
|
||||
#define ALL (S_POSITIVE | 8)
|
||||
#define INODE_LO (S_POSITIVE | 9)
|
||||
#define INODE_HI (S_POSITIVE | 10)
|
||||
|
||||
#define ToLispTime(x) ((int)(x) + 29969152)
|
||||
/* For getfileinfo. For WDATE&RDATE */
|
||||
@@ -310,178 +312,10 @@ do { \
|
||||
/* * * * * it gave "Too many characters in a character constant" errors! */
|
||||
#include "lispver1.h"
|
||||
#else /* DOS */
|
||||
/* NON-DOS version of the macro LispVersionToUnixVersion */
|
||||
#include "lispver2.h"
|
||||
/* NON-DOS version is inline in ufs.c */
|
||||
#endif /* DOS */
|
||||
|
||||
|
||||
/*
|
||||
* Name: UnixVersionToLispVersion
|
||||
*
|
||||
* Argument: char *pathname
|
||||
* UNIX syntax pathname.
|
||||
* int vlessp
|
||||
* If 0, versionless file is converted to version 1.
|
||||
* Otherwise, remains as versionless.
|
||||
*
|
||||
* Value: On success returns 1, otherwise 0.
|
||||
*
|
||||
* Side Effect: The version part of pathname is destructively modified.
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Destructively modifies the version part of pathname which is following the
|
||||
* UNIX file naming convention to Xerox Lisp one.
|
||||
* This macro should be called, in the routines which convert the UNIX pathname
|
||||
* to Lisp one, just before it returns the result to Lisp, because converting
|
||||
* version field will append a semicolon which may confuse the routine
|
||||
* The file which does not have a valid version field, that is ".~##~" form, is
|
||||
* dealt with as version 1.
|
||||
*/
|
||||
|
||||
#define UnixVersionToLispVersion(pathname, vlessp) do { \
|
||||
\
|
||||
char *start; \
|
||||
char *end; \
|
||||
char *lf_cp; \
|
||||
int ver_no; \
|
||||
size_t len; \
|
||||
char ver_buf[VERSIONLEN]; \
|
||||
\
|
||||
if ((start = strchr(pathname, '~')) != NULL) { \
|
||||
/* First of all, find the version field in pathname. */ \
|
||||
end = start; \
|
||||
lf_cp = start + 1; \
|
||||
while (*lf_cp) { \
|
||||
if (*lf_cp == '~') { \
|
||||
start = end; \
|
||||
end = lf_cp; \
|
||||
lf_cp++; \
|
||||
} else { \
|
||||
lf_cp++; \
|
||||
} \
|
||||
} \
|
||||
\
|
||||
if (start != end && *(start - 1) == '.' && end == (lf_cp - 1)) { \
|
||||
/* \
|
||||
* pathname ends in the form ".~###~". But we \
|
||||
* check ### is a valid number or not. \
|
||||
*/ \
|
||||
len = (end - start) - 1; \
|
||||
strncpy(ver_buf, start + 1, len); \
|
||||
ver_buf[len] = '\0'; \
|
||||
NumericStringP(ver_buf, YES, NO); \
|
||||
YES: \
|
||||
*(start - 1) = ';'; \
|
||||
*start = '\0'; \
|
||||
*end = '\0'; \
|
||||
/* call strtoul() to eliminate leading 0s. */ \
|
||||
ver_no = strtoul(start + 1, (char **)NULL, 10); \
|
||||
sprintf(ver_buf, "%u", ver_no); \
|
||||
strcat(pathname, ver_buf); \
|
||||
goto CONT; \
|
||||
\
|
||||
NO: \
|
||||
/* Dealt with as version 1 unless vlessp */ \
|
||||
if (!(vlessp)) strcat(pathname, ";1"); \
|
||||
CONT: \
|
||||
lf_cp--; /* Just for label */ \
|
||||
} else { \
|
||||
/* Dealt with as version 1 unless vlessp. */ \
|
||||
if (!(vlessp)) strcat(pathname, ";1"); \
|
||||
} \
|
||||
} else { \
|
||||
/* Dealt with as version 1 unless vlessp. */ \
|
||||
if (!(vlessp)) strcat(pathname, ";1"); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Name: ConcDirAndName
|
||||
*
|
||||
* Argument: char *dir The name of the directory.
|
||||
* char *name The name of a file.
|
||||
* char *fname The place where the full file name should be
|
||||
* stored.
|
||||
* Value: N/A
|
||||
*
|
||||
* Side Effect: fname is replaced with the full file name.
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Concatenate the directory name and root file name. Checks if dir contains
|
||||
* the trail directory delimiter or not.
|
||||
*
|
||||
*/
|
||||
|
||||
#define ConcDirAndName(dir, name, fname) do { \
|
||||
\
|
||||
char *lf_cp1, *lf_cp2; \
|
||||
\
|
||||
lf_cp1 = dir; \
|
||||
lf_cp2 = dir; \
|
||||
\
|
||||
while (*lf_cp2 != '\0') { \
|
||||
switch (*lf_cp2) { \
|
||||
\
|
||||
case '/': \
|
||||
lf_cp1 = lf_cp2; \
|
||||
lf_cp2++; \
|
||||
break; \
|
||||
\
|
||||
default: \
|
||||
lf_cp2++; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (lf_cp1 == (lf_cp2 - 1)) { \
|
||||
if (lf_cp1 == (dir)) { \
|
||||
/* dir is a root directory. */ \
|
||||
strcpy(fname, "/"); \
|
||||
strcat(fname, name); \
|
||||
} else { \
|
||||
/* The trail directory is included. */ \
|
||||
strcpy(fname, dir); \
|
||||
strcat(fname, name); \
|
||||
} \
|
||||
} else { \
|
||||
/* The trail directory is not included */ \
|
||||
strcpy(fname, dir); \
|
||||
strcat(fname, "/"); \
|
||||
strcat(fname, name); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
/*
|
||||
* Name: ConcNameAndVersion
|
||||
*
|
||||
* Argument: char *name The root file name.
|
||||
* char *ver The file version.
|
||||
* char *rname The place where the concatenated file name will be
|
||||
* stored.
|
||||
* Value: N/A
|
||||
*
|
||||
* Side Effect: rname is replaced with the concatenated file name.
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Concatenate the root file name and its version in UNIX format.
|
||||
*
|
||||
*/
|
||||
|
||||
#define ConcNameAndVersion(name, ver, rname) do { \
|
||||
if (*(ver) != '\0') { \
|
||||
strcpy(rname, name); \
|
||||
strcat(rname, ".~"); \
|
||||
strcat(rname, ver); \
|
||||
strcat(rname, "~"); \
|
||||
} else { \
|
||||
strcpy(rname, name); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define VERSIONLEN 16
|
||||
|
||||
#define VERSIONLEN 24
|
||||
#define MAXVERSION 999999999
|
||||
|
||||
#define LASTVERSIONARRAY ((unsigned) -1)
|
||||
|
||||
@@ -37,10 +37,13 @@ extern unsigned int TIMEOUT_TIME;
|
||||
alarm(0); \
|
||||
} while (0)
|
||||
|
||||
|
||||
/* After any use of S_TOUT one should call alarm(0) to cancel
|
||||
* the last pending alarm.
|
||||
*/
|
||||
#define S_TOUT(exp) \
|
||||
alarm(TIMEOUT_TIME), \
|
||||
(exp), \
|
||||
alarm(0)
|
||||
alarm(TIMEOUT_TIME), \
|
||||
(exp)
|
||||
|
||||
#define ERRSETJMP(rval) \
|
||||
do { \
|
||||
|
||||
@@ -5,15 +5,14 @@ LispPTR UFS_getfilename(LispPTR *args);
|
||||
LispPTR UFS_deletefile(LispPTR *args);
|
||||
LispPTR UFS_renamefile(LispPTR *args);
|
||||
LispPTR UFS_directorynamep(LispPTR *args);
|
||||
void UnixVersionToLispVersion(char *pathname, size_t pathsize, int vlessp);
|
||||
void LispVersionToUnixVersion(char *pathname, size_t pathsize);
|
||||
#ifdef DOS
|
||||
int unixpathname(char *src, char *dst, int versionp, int genp, char *drive, int *extlenptr, char *rawname);
|
||||
int unixpathname(char *src, char *dst, int dstlen, int versionp, int genp, char *drive, int *extlenptr, char *rawname);
|
||||
#else
|
||||
int unixpathname(char *src, char *dst, int versionp, int genp);
|
||||
int unixpathname(char *src, char *dst, size_t dstlen, int versionp, int genp);
|
||||
#endif
|
||||
int lisppathname(char *fullname, char *lispname, int dirp, int versionp);
|
||||
int quote_fname(char *file);
|
||||
int quote_fname_ufs(char *file);
|
||||
int quote_dname(char *dir);
|
||||
int lisppathname(char *fullname, char *lispname, size_t lispnamesize, int dirp, int versionp);
|
||||
#ifdef DOS
|
||||
init_host_filesystem(void);
|
||||
exit_host_filesystem(void);
|
||||
|
||||
@@ -200,7 +200,7 @@ int main(int argc, char *argv[]) {
|
||||
goto I_Give_Up;
|
||||
}
|
||||
bcopy(if_data.ifc_req[0].ifr_addr.sa_data, ether_host, 6);
|
||||
strcpy(Ename, if_data.ifc_req[0].ifr_name);
|
||||
strlcpy(Ename, if_data.ifc_req[0].ifr_name, sizeof(Ename));
|
||||
|
||||
fcntl(ether_fd, F_SETFL, fcntl(ether_fd, F_GETFL, 0) | O_ASYNC | O_NONBLOCK);
|
||||
|
||||
|
||||
387
src/ufs.c
387
src/ufs.c
@@ -9,6 +9,7 @@
|
||||
|
||||
#include "version.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <setjmp.h>
|
||||
@@ -176,9 +177,9 @@ LispPTR UFS_getfilename(LispPTR *args)
|
||||
* unixpathname specifies it.
|
||||
*/
|
||||
#ifdef DOS
|
||||
if (unixpathname(lfname, file, 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(lfname, file, sizeof(file), 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
#else
|
||||
if (unixpathname(lfname, file, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(lfname, file, sizeof(file), 0, 0) == 0) return (NIL);
|
||||
#endif /* DOS */
|
||||
|
||||
switch (args[1]) {
|
||||
@@ -200,7 +201,7 @@ LispPTR UFS_getfilename(LispPTR *args)
|
||||
case RECOG_NON:
|
||||
/*
|
||||
* "New" file means the "not existing" file. UNIX device always
|
||||
* recognizes a not existing file as if, the subsequent OPENFILE will
|
||||
* recognizes a not existing file as is, the subsequent OPENFILE will
|
||||
* find the truth.
|
||||
* "Non" recognition is used to recognize a sysout file.
|
||||
*/
|
||||
@@ -210,7 +211,7 @@ LispPTR UFS_getfilename(LispPTR *args)
|
||||
* Now, we convert a file name back to Lisp format. The version field have not
|
||||
* to be converted. The fourth argument for lisppathname specifies it.
|
||||
*/
|
||||
if (lisppathname(file, lfname, 0, 0) == 0) return (NIL);
|
||||
if (lisppathname(file, lfname, sizeof(lfname), 0, 0) == 0) return (NIL);
|
||||
|
||||
STRING_BASE(args[2], base);
|
||||
len = strlen(lfname);
|
||||
@@ -259,9 +260,9 @@ LispPTR UFS_deletefile(LispPTR *args)
|
||||
LispStringToCString(args[0], fbuf, MAXPATHLEN);
|
||||
|
||||
#ifdef DOS
|
||||
if (unixpathname(fbuf, file, 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(fbuf, file, sizeof(file), 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
#else
|
||||
if (unixpathname(fbuf, file, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(fbuf, file, sizeof(file), 0, 0) == 0) return (NIL);
|
||||
#endif /* DOS */
|
||||
/* check if we're operating on directory or file */
|
||||
TIMEOUT(rval = stat(file, &sbuf));
|
||||
@@ -327,15 +328,15 @@ LispPTR UFS_renamefile(LispPTR *args)
|
||||
|
||||
LispStringToCString(args[0], fbuf, MAXPATHLEN);
|
||||
#ifdef DOS
|
||||
if (unixpathname(fbuf, src, 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(fbuf, src, sizeof(src), 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
#else
|
||||
if (unixpathname(fbuf, src, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(fbuf, src, sizeof(src), 0, 0) == 0) return (NIL);
|
||||
#endif /* DOS */
|
||||
LispStringToCString(args[1], fbuf, MAXPATHLEN);
|
||||
#ifdef DOS
|
||||
if (unixpathname(fbuf, dst, 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(fbuf, dst, sizeof(dst), 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
#else
|
||||
if (unixpathname(fbuf, dst, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(fbuf, dst, sizeof(dst), 0, 0) == 0) return (NIL);
|
||||
#endif /* DOS */
|
||||
|
||||
TIMEOUT(rval = rename(src, dst));
|
||||
@@ -400,9 +401,9 @@ LispPTR UFS_directorynamep(LispPTR *args)
|
||||
|
||||
/* Convert Xerox Lisp file naming convention to Unix one. */
|
||||
#ifdef DOS
|
||||
if (unixpathname(dirname, fullname, 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(dirname, fullname, sizeof(fullname), 0, 0, 0, 0, 0) == 0) return (NIL);
|
||||
#else
|
||||
if (unixpathname(dirname, fullname, 0, 0) == 0) return (NIL);
|
||||
if (unixpathname(dirname, fullname, sizeof(fullname), 0, 0) == 0) return (NIL);
|
||||
#endif /* DOS */
|
||||
|
||||
TIMEOUT(rval = stat(fullname, &sbuf));
|
||||
@@ -414,7 +415,7 @@ LispPTR UFS_directorynamep(LispPTR *args)
|
||||
if (!S_ISDIR(sbuf.st_mode)) return (NIL);
|
||||
|
||||
/* Convert Unix file naming convention to Xerox Lisp one. */
|
||||
if (lisppathname(fullname, dirname, 1, 0) == 0) return (NIL);
|
||||
if (lisppathname(fullname, dirname, sizeof(dirname), 1, 0) == 0) return (NIL);
|
||||
|
||||
len = strlen(dirname);
|
||||
STRING_BASE(args[1], base);
|
||||
@@ -428,6 +429,95 @@ LispPTR UFS_directorynamep(LispPTR *args)
|
||||
return (GetSmallp(len));
|
||||
}
|
||||
|
||||
/*
|
||||
* Name: UnixVersionToLispVersion
|
||||
*
|
||||
* Argument: char *pathname
|
||||
* size_t pathsize
|
||||
* int vlessp
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Converts the Unix version in pathname to a Lisp syntax version.
|
||||
* If there is no recognizable version present, and vlessp is not
|
||||
* true then a Lisp version 1 (";1") will be added to the name.
|
||||
*
|
||||
* Initially only the "standard" .~nnn~ form of a version is recognized.
|
||||
* It may be possible in the future to recognize IFS "!nnn"
|
||||
*/
|
||||
|
||||
void UnixVersionToLispVersion(char *pathname, size_t pathsize, int vlessp) {
|
||||
char *ep = &pathname[strlen(pathname) - 1];
|
||||
char *uvp;
|
||||
|
||||
#ifdef IFSVERSION
|
||||
if (isdigit(*ep)) goto maybeifsversion; /* possibly foo!## */
|
||||
#endif
|
||||
if (*ep-- != '~') goto noversion; /* definitely not .~###~ */
|
||||
if (!isdigit(*ep)) goto noversion; /* requires at least one digit */
|
||||
while (isdigit(*ep)) ep--; /* consume all digits */
|
||||
if (*ep-- != '~') goto noversion; /* definitely not .~###~ */
|
||||
if (*ep != '.') goto noversion;
|
||||
/* must end .~###~ and ep points at the dot */
|
||||
*ep++ = ';'; /* smash . to ; and point to ~ where version will go*/
|
||||
for (uvp = ep + 1; *uvp == '0' && *(uvp + 1) != '~'; uvp++); /* skip leading zeroes */
|
||||
while (*uvp != '~') *ep++ = *uvp++; /* shift version back */
|
||||
*ep = '\0'; /* terminate the string */
|
||||
return;
|
||||
noversion:
|
||||
if (!vlessp) strlcat(pathname, ";1", pathsize);
|
||||
return;
|
||||
#ifdef IFSVERSION
|
||||
maybeifsversion:
|
||||
while (isdigit(*ep)) ep--; /* consume all digits */
|
||||
if (*ep != '!') goto noversion;
|
||||
*ep = ';';
|
||||
return;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Name: LispVersionToUnixVersion
|
||||
*
|
||||
* Arguments: char *pathname Xerox Lisp style pathname
|
||||
* size_t pathsize Length of pathname buffer
|
||||
*
|
||||
* Helper procedure used by unixpathname to convert from a Lisp style path
|
||||
* with ";version" style version number to the ".~version~" format used in
|
||||
* the underlying host file system.
|
||||
* If a syntactically correct version (all numeric, starting at the rightmost
|
||||
* unescaped (') semicolon) is found it will be replaced by the host version,
|
||||
* otherwise the procedure will return the pathname unchanged.
|
||||
*
|
||||
*/
|
||||
void LispVersionToUnixVersion(char *pathname, size_t pathsize) {
|
||||
char version[VERSIONLEN] = {0};
|
||||
char *vp = NULL;
|
||||
char *ep = &pathname[strlen(pathname) - 1]; /* from the end */
|
||||
while (ep >= pathname) { /* until the beginning */
|
||||
if (*ep == ';' && /* found a semicolon */
|
||||
(ep == pathname || *(ep - 1) != '\'')) {/* at the beginning or not quoted */
|
||||
vp = ep; /* version starts at unquoted semicolon */
|
||||
break; /* stop when found version */
|
||||
}
|
||||
ep--; /* previous character */
|
||||
}
|
||||
|
||||
if (vp == NULL) return; /* there was no version field */
|
||||
|
||||
*vp++ = '\0'; /* end name at the semicolon */
|
||||
if (*vp == '\0') return; /* empty version field */
|
||||
|
||||
while (*vp == '0') vp++; /* skip leading zeros */
|
||||
if (*vp == '\0') return; /* all zero version is no version */
|
||||
version[0] = '.'; /* leading version marker */
|
||||
version[1] = '~'; /* leading version marker */
|
||||
strlcat(version, vp, VERSIONLEN); /* the trimmed version from the source */
|
||||
strlcat(version, "~", VERSIONLEN); /* trailing version marker */
|
||||
strlcat(pathname, version, pathsize); /* concatenate version to pathname */
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Name: unixpathname
|
||||
*
|
||||
@@ -437,6 +527,7 @@ LispPTR UFS_directorynamep(LispPTR *args)
|
||||
* if the pathname is passed as a directory, the
|
||||
* tail delimiter may be included.
|
||||
* char *dst The buffer to which the converted pathname is stored.
|
||||
* int dstlen The size of the dst buffer
|
||||
* int versionp
|
||||
* If 1, version field in src is converted to UNIX
|
||||
* version form. {DSK} device invokes unixpathname
|
||||
@@ -463,9 +554,9 @@ LispPTR UFS_directorynamep(LispPTR *args)
|
||||
*
|
||||
*/
|
||||
#ifdef DOS
|
||||
int unixpathname(char *src, char *dst, int versionp, int genp, char *drive, int *extlenptr, char *rawname)
|
||||
int unixpathname(char *src, char *dst, int dstlen, int versionp, int genp, char *drive, int *extlenptr, char *rawname)
|
||||
#else
|
||||
int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
int unixpathname(char *src, char *dst, size_t dstlen, int versionp, int genp)
|
||||
#endif /* DOS */
|
||||
{
|
||||
char *cp, *dp, *np;
|
||||
@@ -495,12 +586,12 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
* file system code.
|
||||
*/
|
||||
if (strcmp(src, "<") == 0) {
|
||||
strcpy(dst, DIRSEPSTR);
|
||||
strlcpy(dst, DIRSEPSTR, dstlen);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/* Copy src to protect it from destructive modification. */
|
||||
strcpy(lfname, src);
|
||||
strlcpy(lfname, src, sizeof(lfname));
|
||||
|
||||
/*
|
||||
* If versionp is specified, we have to deal with the version field first,
|
||||
@@ -510,7 +601,7 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
#ifdef DOS
|
||||
if (versionp) LispVersionToUnixVersion(lfname, version); else version = -1;
|
||||
#else
|
||||
if (versionp) LispVersionToUnixVersion(lfname);
|
||||
if (versionp) LispVersionToUnixVersion(lfname, sizeof(lfname));
|
||||
#endif /* DOS */
|
||||
|
||||
cp = lfname;
|
||||
@@ -582,7 +673,7 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
TIMEOUT0(pwd = getpwuid(getuid()));
|
||||
if (pwd == NULL) return (0);
|
||||
|
||||
strcpy(dst, pwd->pw_dir);
|
||||
strlcpy(dst, pwd->pw_dir, dstlen);
|
||||
while (*dp != '\0') dp++;
|
||||
if (*(dp - 1) != DIRSEP) {
|
||||
/*
|
||||
@@ -606,7 +697,7 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
TIMEOUT0(pwd = getpwnam(name));
|
||||
if (pwd == NULL) return (0);
|
||||
|
||||
strcpy(dst, pwd->pw_dir);
|
||||
strlcpy(dst, pwd->pw_dir, dstlen);
|
||||
while (*dp != '\0') dp++;
|
||||
if (*(dp - 1) != DIRSEP) {
|
||||
/*
|
||||
@@ -769,6 +860,8 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
#ifdef DOS
|
||||
if (NameValid) *dp++ = *(cp + 1);
|
||||
CountNameChars;
|
||||
#else
|
||||
*dp++ = *(cp + 1);
|
||||
#endif /* DOS */
|
||||
cp += 2;
|
||||
break;
|
||||
@@ -807,10 +900,10 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
* for the convenience of the pattern matching routines, we don't
|
||||
* care about the last period character.
|
||||
*/
|
||||
strcpy(fbuf1, lfname);
|
||||
strcpy(fbuf2, dst);
|
||||
separate_version(fbuf1, ver1, 1);
|
||||
separate_version(fbuf2, ver2, 1);
|
||||
strlcpy(fbuf1, lfname, sizeof(fbuf1));
|
||||
strlcpy(fbuf2, dst, sizeof(fbuf2));
|
||||
separate_version(fbuf1, sizeof(fbuf1), ver1, sizeof(ver1), 1);
|
||||
separate_version(fbuf2, sizeof(fbuf2), ver2, sizeof(ver2), 1);
|
||||
for (cp = fbuf1; *cp; cp++) {}
|
||||
for (dp = fbuf2; *dp; dp++) {}
|
||||
if (*(cp - 1) == '.') {
|
||||
@@ -825,11 +918,11 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
}
|
||||
#ifdef DOS
|
||||
if (version >= 0)
|
||||
sprintf(ver2, "%d", version);
|
||||
snprintf(ver2, sizeof(ver2), "%d", version);
|
||||
else
|
||||
*ver2 = '\0';
|
||||
#endif /* DOS */
|
||||
ConcNameAndVersion(fbuf2, ver2, dst);
|
||||
conc_name_and_version(fbuf2, ver2, dst, dstlen);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
@@ -845,6 +938,7 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
* The lispname is used to determine which
|
||||
* character should be quoted in the result
|
||||
* Xerox Lisp pathname representation.
|
||||
* size_t lispnamesize size of storage available for lispname
|
||||
* int dirp If 1, fullname is a directory. If 0,
|
||||
* fullname is a file.
|
||||
* int versionp If 1, version field is also converted
|
||||
@@ -871,14 +965,14 @@ int unixpathname(char *src, char *dst, int versionp, int genp)
|
||||
*
|
||||
*/
|
||||
|
||||
int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
|
||||
int lisppathname(char *fullname, char *lispname, size_t lispnamesize, int dirp, int versionp)
|
||||
{
|
||||
char *cp, *dp, *lnamep, *cnamep;
|
||||
char namebuf[MAXPATHLEN], fbuf[MAXPATHLEN], ver[VERSIONLEN];
|
||||
int i, mask, extensionp;
|
||||
|
||||
if (strcmp(fullname, DIRSEPSTR) == 0) {
|
||||
strcpy(lispname, "<");
|
||||
strlcpy(lispname, "<", lispnamesize);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -940,7 +1034,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
|
||||
* ' ''
|
||||
* . '. only if it is used as a part of the extension
|
||||
* field.
|
||||
* others as if
|
||||
* others as is
|
||||
*/
|
||||
|
||||
cp = fullname + 1;
|
||||
@@ -982,7 +1076,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
|
||||
if (dirp) {
|
||||
if (*(dp - 1) != '>' || *(dp - 2) == '\'') *dp++ = '>';
|
||||
*dp = '\0';
|
||||
strcpy(lispname, namebuf);
|
||||
strlcpy(lispname, namebuf, lispnamesize);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -1046,7 +1140,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
|
||||
* or not. If extension field is not included, we have to add a period
|
||||
* to specify empty extension field.
|
||||
*/
|
||||
strcpy(fbuf, namebuf);
|
||||
strlcpy(fbuf, namebuf, sizeof(fbuf));
|
||||
dp = cp = fbuf;
|
||||
while (*cp) {
|
||||
switch (*cp) {
|
||||
@@ -1066,7 +1160,7 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
|
||||
}
|
||||
}
|
||||
cp = dp + 1;
|
||||
if (versionp) separate_version(fbuf, ver, 1);
|
||||
if (versionp) separate_version(fbuf, sizeof(fbuf), ver, sizeof(ver), 1);
|
||||
extensionp = 0;
|
||||
while (*cp && !extensionp) {
|
||||
switch (*cp) {
|
||||
@@ -1087,237 +1181,16 @@ int lisppathname(char *fullname, char *lispname, int dirp, int versionp)
|
||||
*cp = '\0';
|
||||
}
|
||||
if (versionp && *ver != '\0') {
|
||||
ConcNameAndVersion(fbuf, ver, namebuf);
|
||||
conc_name_and_version(fbuf, ver, namebuf, sizeof(namebuf));
|
||||
} else {
|
||||
strcpy(namebuf, fbuf);
|
||||
strlcpy(namebuf, fbuf, sizeof(namebuf));
|
||||
}
|
||||
|
||||
/*
|
||||
* Now, it's time to convert the version field.
|
||||
*/
|
||||
if (!dirp && versionp) UnixVersionToLispVersion(namebuf, 0);
|
||||
if (!dirp && versionp) UnixVersionToLispVersion(namebuf, sizeof(namebuf), 0);
|
||||
|
||||
strcpy(lispname, namebuf);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Name: quote_fname
|
||||
*
|
||||
* Argument: char *file The root file name in UNIX format. "Root"
|
||||
* file name contains the name, extension and
|
||||
* version fields. A valid version field is in a
|
||||
* form as ".~##~".
|
||||
*
|
||||
* Value: If succeed, returns 1, otherwise 0.
|
||||
*
|
||||
* Side Effect: If succeed, file is replaced with the file name in Xerox Lisp format
|
||||
* in which special characters are quoted.
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Converts a UNIX root file name to Xerox Lisp one. This routine only quotes special
|
||||
* characters in Xerox file naming convention, does not care about the "true" name
|
||||
* which might be specified directly by the user as like lisppathname. Thus, this
|
||||
* routine can be invoked when you don't know how to escape the period character. This
|
||||
* is the case when you convert a file name in the course of the directory enumeration.
|
||||
*
|
||||
* This routine is used when file is a "FILE" name and being converted to {DSK} name.
|
||||
*
|
||||
* The special characters which is quoted include "<", ">", ";", and "'" itself. Notice
|
||||
* again that "." is not quoted, because we don't know it is a extension separator in
|
||||
* Lisp sense or not.
|
||||
*/
|
||||
|
||||
int quote_fname(char *file)
|
||||
{
|
||||
char *cp, *dp;
|
||||
int extensionp;
|
||||
char fbuf[MAXNAMLEN + 1], namebuf[MAXNAMLEN + 1], ver[VERSIONLEN];
|
||||
|
||||
cp = file;
|
||||
dp = fbuf;
|
||||
|
||||
while (*cp) {
|
||||
switch (*cp) {
|
||||
case '>':
|
||||
case ';':
|
||||
case '\'':
|
||||
*dp++ = '\'';
|
||||
*dp++ = *cp++;
|
||||
break;
|
||||
|
||||
default: *dp++ = *cp++; break;
|
||||
}
|
||||
}
|
||||
*dp = '\0';
|
||||
|
||||
/*
|
||||
* extensionp indicates whether extension field is included in a file
|
||||
* name or not. If extension field is not included, we have to add a
|
||||
* period to specify empty extension field.
|
||||
*/
|
||||
separate_version(fbuf, ver, 1);
|
||||
cp = fbuf;
|
||||
extensionp = 0;
|
||||
while (*cp && !extensionp) {
|
||||
switch (*cp) {
|
||||
case '.':
|
||||
if (*(cp + 1)) extensionp = 1;
|
||||
cp++;
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
if (*(cp + 1) != '\0')
|
||||
cp += 2;
|
||||
else
|
||||
cp++;
|
||||
break;
|
||||
|
||||
default: cp++; break;
|
||||
}
|
||||
}
|
||||
if (!extensionp) {
|
||||
if (*(cp - 1) == '.') {
|
||||
*(cp - 1) = '\'';
|
||||
*cp++ = '.';
|
||||
}
|
||||
*cp++ = '.';
|
||||
*cp = '\0';
|
||||
}
|
||||
if (*ver != '\0') {
|
||||
ConcNameAndVersion(fbuf, ver, namebuf);
|
||||
} else {
|
||||
strcpy(namebuf, fbuf);
|
||||
}
|
||||
UnixVersionToLispVersion(namebuf, 1);
|
||||
strcpy(file, namebuf);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Name: quote_fname_ufs
|
||||
*
|
||||
* Argument: char *file The root file name in UNIX format. "Root"
|
||||
* file name contains the name, extension and
|
||||
* version fields. A valid version field is in a
|
||||
* form as ".~##~".
|
||||
*
|
||||
* Value: If succeed, returns 1, otherwise 0.
|
||||
*
|
||||
* Side Effect: If succeed, file is replaced with the file name in Xerox Lisp format
|
||||
* in which special characters are quoted.
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Similar to quote_fname, but this routine is only used when file is a "FILE" name
|
||||
* and being converted to {UNIX} name.
|
||||
*/
|
||||
|
||||
int quote_fname_ufs(char *file)
|
||||
{
|
||||
char *cp, *dp;
|
||||
int extensionp;
|
||||
char fbuf[MAXNAMLEN + 1];
|
||||
|
||||
cp = file;
|
||||
dp = fbuf;
|
||||
|
||||
while (*cp) {
|
||||
switch (*cp) {
|
||||
case '>':
|
||||
case ';':
|
||||
case '\'':
|
||||
*dp++ = '\'';
|
||||
*dp++ = *cp++;
|
||||
break;
|
||||
|
||||
default: *dp++ = *cp++; break;
|
||||
}
|
||||
}
|
||||
*dp = '\0';
|
||||
|
||||
/*
|
||||
* extensionp indicates whether extension field is included in a file
|
||||
* name or not. If extension field is not included, we have to add a
|
||||
* period to specify empty extension field.
|
||||
*/
|
||||
cp = fbuf;
|
||||
extensionp = 0;
|
||||
while (*cp && !extensionp) {
|
||||
switch (*cp) {
|
||||
case '.':
|
||||
if (*(cp + 1)) extensionp = 1;
|
||||
cp++;
|
||||
break;
|
||||
|
||||
case '\'':
|
||||
if (*(cp + 1) != '\0')
|
||||
cp += 2;
|
||||
else
|
||||
cp++;
|
||||
break;
|
||||
|
||||
default: cp++; break;
|
||||
}
|
||||
}
|
||||
if (!extensionp) {
|
||||
if (*(cp - 1) == '.') {
|
||||
*(cp - 1) = '\'';
|
||||
*cp++ = '.';
|
||||
}
|
||||
*cp++ = '.';
|
||||
*cp = '\0';
|
||||
}
|
||||
strcpy(file, fbuf);
|
||||
return (1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Name: quote_dname
|
||||
*
|
||||
* Argument: char *dir The directory name in UNIX format. Does not
|
||||
* include its parent name.
|
||||
*
|
||||
* Value: If succeed, returns 1, otherwise 0.
|
||||
*
|
||||
* Side Effect: If succeed, dir is replaced with the directory name in Xerox Lisp
|
||||
* format in which special characters are quoted.
|
||||
*
|
||||
* Description:
|
||||
*
|
||||
* Similar to quote_fname, but this routine is only used when dir is a "DIRECTORY"
|
||||
* name. Both {DSK} and {UNIX} uses this routine.
|
||||
*/
|
||||
|
||||
int quote_dname(char *dir)
|
||||
{
|
||||
char *cp, *dp;
|
||||
char fbuf[MAXNAMLEN + 1];
|
||||
|
||||
cp = dir;
|
||||
dp = fbuf;
|
||||
|
||||
while (*cp) {
|
||||
switch (*cp) {
|
||||
case '>':
|
||||
case ';':
|
||||
case '\'':
|
||||
*dp++ = '\'';
|
||||
*dp++ = *cp++;
|
||||
break;
|
||||
|
||||
default: *dp++ = *cp++; break;
|
||||
}
|
||||
}
|
||||
*dp = '\0';
|
||||
|
||||
if (*(dp - 1) == '.') {
|
||||
/* Trail period should be quoted. */
|
||||
*(dp - 1) = '\'';
|
||||
*dp++ = '.';
|
||||
}
|
||||
|
||||
strcpy(dir, fbuf);
|
||||
strlcpy(lispname, namebuf, lispnamesize);
|
||||
return (1);
|
||||
}
|
||||
|
||||
@@ -303,7 +303,7 @@ int FindUnixPipes(void) {
|
||||
/* */
|
||||
/************************************************************************/
|
||||
|
||||
static int FindAvailablePty(char *Slave) {
|
||||
static int FindAvailablePty(char *Slave, size_t SlaveLen) {
|
||||
int res;
|
||||
|
||||
res = posix_openpt(O_RDWR);
|
||||
@@ -313,7 +313,7 @@ static int FindAvailablePty(char *Slave) {
|
||||
}
|
||||
grantpt(res);
|
||||
unlockpt(res);
|
||||
strcpy(Slave, ptsname(res));
|
||||
strlcpy(Slave, ptsname(res), SlaveLen);
|
||||
DBPRINT(("slave pty name is %s.\n", Slave));
|
||||
|
||||
if (res != -1) {
|
||||
@@ -392,7 +392,7 @@ LispPTR Unix_handlecomm(LispPTR *args) {
|
||||
PipeName = build_socket_pathname(sockFD);
|
||||
memset(&sock, 0, sizeof(sock));
|
||||
sock.sun_family = AF_UNIX;
|
||||
strcpy(sock.sun_path, PipeName);
|
||||
strlcpy(sock.sun_path, PipeName, sizeof(sock.sun_path));
|
||||
if (bind(sockFD, (struct sockaddr *)&sock, sizeof(struct sockaddr_un)) < 0) {
|
||||
close(sockFD);
|
||||
perror("binding sockets");
|
||||
@@ -570,7 +570,7 @@ LispPTR Unix_handlecomm(LispPTR *args) {
|
||||
int Master;
|
||||
unsigned short len;
|
||||
|
||||
Master = FindAvailablePty(SlavePTY);
|
||||
Master = FindAvailablePty(SlavePTY, sizeof(SlavePTY));
|
||||
DBPRINT(("Fork Shell; Master PTY = %d. Slave=%c%c.\n", Master, SlavePTY[0], SlavePTY[1]));
|
||||
if (Master < 0) {
|
||||
printf("Open of lisp side of PTY failed.\n");
|
||||
@@ -771,6 +771,7 @@ LispPTR Unix_handlecomm(LispPTR *args) {
|
||||
{
|
||||
int sockFD;
|
||||
struct sockaddr_un sock;
|
||||
size_t pathsize;
|
||||
|
||||
/* First open the socket */
|
||||
sockFD = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
@@ -782,12 +783,13 @@ LispPTR Unix_handlecomm(LispPTR *args) {
|
||||
socket into it */
|
||||
/* need to type-check the string here */
|
||||
LispStringToCString(args[1], shcom, 2048);
|
||||
UJ[sockFD].pathname = malloc(strlen(shcom) + 1);
|
||||
strcpy(UJ[sockFD].pathname, shcom);
|
||||
pathsize = strlen(shcom) + 1;
|
||||
UJ[sockFD].pathname = malloc(pathsize);
|
||||
strlcpy(UJ[sockFD].pathname, shcom, pathsize);
|
||||
/* Then bind it to the pathname, and get it listening properly */
|
||||
|
||||
sock.sun_family = AF_UNIX;
|
||||
strcpy(sock.sun_path, shcom);
|
||||
strlcpy(sock.sun_path, shcom, sizeof(sock.sun_path));
|
||||
if (bind(sockFD, (struct sockaddr *)&sock, sizeof(struct sockaddr_un)) < 0) {
|
||||
close(sockFD);
|
||||
free(UJ[sockFD].pathname);
|
||||
|
||||
@@ -358,7 +358,7 @@ int fork_Unix(void) {
|
||||
(void)snprintf(PipeName, sizeof(PipeName), "/tmp/LPU%ld-%d", StartTime, slot);
|
||||
memset(&addr, 0, sizeof(struct sockaddr_un));
|
||||
addr.sun_family = AF_UNIX;
|
||||
strcpy(addr.sun_path, PipeName);
|
||||
strlcpy(addr.sun_path, PipeName, sizeof(addr.sun_path));
|
||||
status =
|
||||
connect(sock, (struct sockaddr *)&addr, sizeof(struct sockaddr_un));
|
||||
if (status < 0) {
|
||||
|
||||
@@ -156,36 +156,36 @@ LispPTR vmem_save0(LispPTR *args)
|
||||
LispStringToCString(args[0], pathname, MAXPATHLEN);
|
||||
separate_host(pathname, host);
|
||||
#ifdef DOS
|
||||
if (!unixpathname(pathname, sysout, 0, 0, drive, 0, 0)) return (BADFILENAME);
|
||||
if (!unixpathname(pathname, sysout, sizeof(sysout), 0, 0, drive, 0, 0)) return (BADFILENAME);
|
||||
#else
|
||||
if (!unixpathname(pathname, sysout, 0, 0)) return (BADFILENAME);
|
||||
if (!unixpathname(pathname, sysout, sizeof(sysout), 0, 0)) return (BADFILENAME);
|
||||
#endif /* DOS */
|
||||
return (vmem_save(sysout));
|
||||
} else {
|
||||
if ((def = getenv("LDEDESTSYSOUT")) == 0) {
|
||||
#ifdef DOS
|
||||
if (getcwd(pwd, MAXNAMLEN) == NULL) return (FILETIMEOUT);
|
||||
strcpy(sysout, pwd);
|
||||
strcat(sysout, "/lisp.vm");
|
||||
strlcpy(sysout, pwd, sizeof(sysout));
|
||||
strlcat(sysout, "/lisp.vm", sizeof(sysout));
|
||||
#else
|
||||
pwd = getpwuid(getuid()); /* NEED TIMEOUT */
|
||||
if (pwd == (struct passwd *)NULL) return (FILETIMEOUT);
|
||||
strcpy(sysout, pwd->pw_dir);
|
||||
strcat(sysout, "/lisp.virtualmem");
|
||||
strlcpy(sysout, pwd->pw_dir, sizeof(sysout));
|
||||
strlcat(sysout, "/lisp.virtualmem", sizeof(sysout));
|
||||
#endif /* DOS */
|
||||
} else {
|
||||
if (*def == '~' && (*(def + 1) == '/' || *(def + 1) == '\0')) {
|
||||
#ifdef DOS
|
||||
if (getcwd(pwd, MAXNAMLEN) == NULL) return (FILETIMEOUT);
|
||||
strcpy(sysout, pwd);
|
||||
strlcpy(sysout, pwd, sizeof(sysout));
|
||||
#else
|
||||
pwd = getpwuid(getuid()); /* NEED TIMEOUT */
|
||||
if (pwd == (struct passwd *)NULL) return (FILETIMEOUT);
|
||||
strcpy(sysout, pwd->pw_dir);
|
||||
strlcpy(sysout, pwd->pw_dir, sizeof(sysout));
|
||||
#endif /* DOS */
|
||||
strcat(sysout, def + 1);
|
||||
strlcat(sysout, def + 1, sizeof(sysout));
|
||||
} else {
|
||||
strcpy(sysout, def);
|
||||
strlcpy(sysout, def, sizeof(sysout));
|
||||
}
|
||||
}
|
||||
return (vmem_save(sysout));
|
||||
@@ -349,9 +349,9 @@ LispPTR vmem_save(char *sysout_file_name)
|
||||
SETJMP(FILETIMEOUT);
|
||||
#ifdef DOS
|
||||
/* Bloddy 8 char filenames in dos ... /jarl */
|
||||
make_old_version(tempname, sysout_file_name);
|
||||
make_old_version(tempname, sizeof(tempname), sysout_file_name);
|
||||
#else /* DOS */
|
||||
sprintf(tempname, "%s-temp", sysout_file_name);
|
||||
snprintf(tempname, sizeof(tempname), "%s-temp", sysout_file_name);
|
||||
#endif /* DOS */
|
||||
|
||||
/* Confirm protection of specified file by open/close */
|
||||
|
||||
16
src/xrdopt.c
16
src/xrdopt.c
@@ -17,7 +17,7 @@
|
||||
#include <limits.h> // for PATH_MAX
|
||||
#include <stdio.h> // for fprintf, NULL, stderr, sscanf
|
||||
#include <stdlib.h> // for getenv, exit, strtol
|
||||
#include <string.h> // for strncpy, strcat, strcpy, strcmp
|
||||
#include <string.h> // for strncpy, strlcat, strlcpy, strcmp
|
||||
#include <sys/types.h> // for u_char
|
||||
#include <unistd.h> // for access, R_OK
|
||||
#include "xdefs.h" // for WINDOW_NAME
|
||||
@@ -211,13 +211,13 @@ void read_Xoption(int *argc, char *argv[])
|
||||
print_Xusage(argv[0]);
|
||||
} else {
|
||||
envname = getenv("DISPLAY");
|
||||
(void)strcpy(Display_Name, envname);
|
||||
(void)strlcpy(Display_Name, envname, sizeof(Display_Name));
|
||||
}
|
||||
if ((xdisplay = XOpenDisplay(Display_Name)) != NULL) {
|
||||
/* read the other databases */
|
||||
/* Start with app-defaults/medley */
|
||||
(void)strcpy(tmp, "/usr/lib/X11/app-defaults/");
|
||||
(void)strcat(tmp, "medley");
|
||||
(void)strlcpy(tmp, "/usr/lib/X11/app-defaults/", sizeof(tmp));
|
||||
(void)strlcat(tmp, "medley", sizeof(tmp));
|
||||
applicationDB = XrmGetFileDatabase(tmp);
|
||||
if (applicationDB != NULL) { (void)XrmMergeDatabases(applicationDB, &rDB); }
|
||||
/* Then try the displays defaults */
|
||||
@@ -232,8 +232,8 @@ void read_Xoption(int *argc, char *argv[])
|
||||
}
|
||||
|
||||
envname = getenv("HOME");
|
||||
(void)strcat(tmp, envname);
|
||||
(void)strcat(tmp, "/.Xdefaults");
|
||||
(void)strlcpy(tmp, envname, sizeof(tmp));
|
||||
(void)strlcat(tmp, "/.Xdefaults", sizeof(tmp));
|
||||
if (access(tmp, R_OK) != 0) {
|
||||
serverDB = XrmGetFileDatabase(tmp);
|
||||
if (serverDB != NULL) { (void)XrmMergeDatabases(serverDB, &rDB); }
|
||||
@@ -255,7 +255,7 @@ void read_Xoption(int *argc, char *argv[])
|
||||
if (XrmGetResource(rDB, "ldex.icontitle", "Ldex.icontitle", str_type, &value) == True) {
|
||||
(void)strncpy(iconTitle, value.addr, value.size);
|
||||
} else {
|
||||
(void)strcpy(iconTitle, "Medley");
|
||||
(void)strlcpy(iconTitle, "Medley", sizeof(iconTitle));
|
||||
}
|
||||
|
||||
if (XrmGetResource(rDB, "ldex.iconbitmap", "Ldex.Iconbitmap", str_type, &value) == True) {
|
||||
@@ -276,8 +276,6 @@ void read_Xoption(int *argc, char *argv[])
|
||||
&LispDisplayRequestedWidth, &LispDisplayRequestedHeight);
|
||||
}
|
||||
|
||||
(void)strcpy(tmp, ""); /* Clear the string */
|
||||
|
||||
if (XrmGetResource(rDB, "ldex.cursorColor", "Ldex.cursorColor", str_type, &value) == True) {
|
||||
(void)strncpy(cursorColor, value.addr, sizeof(cursorColor) - 1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user