P8000/WEGA/contrib/K5JB/files.c

534 lines
12 KiB
C

/* System-dependent definitions of various files, spool directories, etc
* Jerked some of this stuff out of main.c which was getting too bulky.
* Define SKIP_FSCHECK if you want to skip the file system checks and save
* about 416 bytes on the MS-DOS version. SKIP_FSCHECK is only used in
* this file. k34 - K5JB
*/
#include "options.h"
#include "config.h"
#include <stdio.h>
#ifdef UNIX
#include <sys/types.h>
#endif
#ifndef SKIP_FSCHECK /* default is to do file system check on start */
#ifdef MSDOS
#include <sys\stat.h>
#else
#include <sys/stat.h>
#endif
#endif
#include "global.h"
#include "netuser.h"
#include "timer.h"
#include "tcp.h"
#include "mbuf.h"
#include <string.h>
#include <time.h>
#define LINES_PER_PAGE 22 /* for the jump arg */
#ifdef _OSK
#include "os9stat.h"
#endif
#ifdef MSDOS
/* Special open modes when reading binary files
* Index definitions for this array are in global.h
*/
char *binmode[] = {
"rb", /* Read binary */
"wb", /* Write binary */
"ab" /* Append binary */
};
#else /* UNIX and such */
char *binmode[] = {
"r", /* Read */
"w", /* Write */
"a" /* Append */
};
#endif
#ifdef MSDOS
char *homedir = "";
char *startup = "autoexec.net"; /* Initialization file */
char *userfile = "ftpusers"; /* Authorized FTP users and passwords */
char *hosts = "hosts.net"; /* Network host table */
char *spool = "/spool";
char *mailspool = "mail"; /* Incoming mail */
char *mailqdir = "mqueue"; /* Outgoing mail spool */
char *mailqueue = "mqueue/*.wrk";/* Outgoing mail work files */
char *routeqdir = "rqueue"; /* queue for router */
char *alias = "alias"; /* the alias file */
#ifdef REWRITE
char *Rewritefile = "rewrite.net"; /* note different name from NOS */
#endif
#ifdef AX25
char *helpbox = "helpbox.hlp"; /* help file for mbox */
#endif
char *public = "/public"; /* where downloadable files are */
#ifdef _FINGER
char *fingersuf = ".txt"; /* Text info for finger command */
char *fingerpath = "finger/"; /* Path to finger info files */
#endif
#endif
#if defined(AX25) && defined(MULPORT)
char *mdigilist = "digilist"; /* GRAPES mulport code */
char *mexlist = "exlist";
#endif
#ifdef UNIX
char *homedir = ".";
char *netexe = "/usr/net/net"; /* where the binary lives for reset */
char *startup = "startup.net"; /* Initialization file */
/*char *config = "config.net";*/ /* Device configuration list - not used */
char *userfile = "ftpusers";
char *hosts = "hosts.net";
char *spool = "/usr/spool"; /* path to the mail files */
char *mailspool = "mail";
char *mailqdir = "mqueue";
char *mailqueue = "mqueue/*.wrk";
char *routeqdir = "rqueue"; /* queue for router */
char *alias = "aliases"; /* the alias file */
#ifdef REWRITE
char *Rewritefile = "rewrite.net"; /* note different name from NOS */
#endif
#ifdef AX25
char *helpbox = "helpbox.hlp"; /* mbox help file */
#endif
char *public = "/usr/public"; /* downloadable mbox files here */
#ifdef _FINGER
char *fingersuf = ".txt"; /* Text info for finger command */
char *fingerpath = "finger/"; /* Path to finger info files */
#endif
#endif
static char *logname;
static FILE *logfp;
extern char nospace[],hostname[];
char *
make_path(path_ptr,file_ptr,slash)
char *path_ptr;
char *file_ptr;
int slash;
{
char *cp, *malloc();
if ((cp = malloc(strlen(path_ptr) + strlen(file_ptr) + 2)) == NULLCHAR)
perror(nospace);
else {
sprintf(cp, "%s%s%s", path_ptr,slash ? "/" : "",file_ptr);
return(cp);
}
return(NULLCHAR);
}
/* found idea for this in sys5unix.c, but it wasn't completed - K5JB */
/* added SKIP_FSCHECK in k34
*/
void
fileinit(cmdarg)
char *cmdarg;
{
char *ep;
extern char *getenv();
#ifndef SKIP_FSCHECK
int showstopper = 0;
extern int exitval,doexit();
struct stat statbuf;
/* be sure and change these if you add tests below */
#define NOTEWORTHY 1
#define WARNING 2
#define SHOWSTOP 3
struct reports {
char *filepath;
int type;
};
static struct reports rep[11]; /* BE CAREFUL to change this if you */
struct reports *repp; /* add tests below. It is tests + 1 */
repp = rep;
#endif /* SKIP_FSCHECK */
#ifdef UNIX
if((ep = getenv("NETHOME")) != NULLCHAR ||
(ep = getenv("HOME")) != NULLCHAR)
#else
if((ep = getenv("NETHOME")) != NULLCHAR)
#endif
#ifndef SKIP_FSCHECK
{
homedir = make_path(ep,"",0);
repp->filepath = homedir;
(repp++)->type = SHOWSTOP;
}else
ep = homedir;
/* Replace each of the file name strings with the complete path */
if(cmdarg == NULLCHAR)
startup = make_path(ep,startup,1);
else
startup = make_path(ep,cmdarg,1);
repp->filepath = startup;
(repp++)->type = WARNING;
userfile = make_path(ep,userfile,1);
repp->filepath = userfile;
(repp++)->type = WARNING;
hosts = make_path(ep,hosts,1);
repp->filepath = hosts;
(repp++)->type = WARNING;
alias = make_path(ep,alias,1);
repp->filepath = alias;
(repp++)->type = NOTEWORTHY;
#ifdef AX25
helpbox = make_path(ep,helpbox,1);
repp->filepath = helpbox;
(repp++)->type = NOTEWORTHY;
#endif
#ifdef _FINGER /* note that stat() won't work on this one */
fingerpath = make_path(ep,fingerpath,1);
#endif
#if defined(AX25) && defined(MULPORT)
/* not too worried if these don't exist */
mdigilist = make_path(ep,mdigilist,1); /* GRAPES mulport code */
mexlist = make_path(ep,mexlist,1);
#endif
#ifdef REWRITE
Rewritefile = make_path(ep,Rewritefile,1);
#endif
#ifdef UNIX
netexe = make_path(ep,"net",1);
#endif
if((ep = getenv("PUBLIC")) != NULLCHAR){
public = make_path(ep,"",0);
repp->filepath = public;
/* not really a showstopper but is a directory */
(repp++)->type = SHOWSTOP;
}
if((ep = getenv("NETSPOOL")) != NULLCHAR){
spool = make_path(ep,"",0);
repp->filepath = spool; /* may revisit this after testing */
(repp++)->type = SHOWSTOP;
}
mailspool = make_path(spool,mailspool,1);
repp->filepath = mailspool;
(repp++)->type = SHOWSTOP;
mailqdir = make_path(spool,mailqdir,1);
repp->filepath = mailqdir; /* Make DAMN sure this doesn't violate mem */
(repp++)->type = SHOWSTOP; /* See note where it is defined */
mailqueue = make_path(spool,mailqueue,1);
routeqdir = make_path(spool,routeqdir,1);
for(repp = rep;repp->filepath != NULLCHAR; repp++){
if(stat(repp->filepath,&statbuf) != 0){
printf("%s: %s %s not found\n",repp->type == NOTEWORTHY ?
"Note" : repp->type == WARNING ? "Warning" : "Error",
repp->type == SHOWSTOP ? "Directory" : "File",
repp->filepath);
showstopper |= repp->type == SHOWSTOP;
continue;
}
if(repp->type == SHOWSTOP && !(statbuf.st_mode & S_IFDIR)){
printf("Error: %s is a file, not a directory\n",repp->filepath);
showstopper |= repp->type == SHOWSTOP;
}
}
if(showstopper){
printf("\nSorry, Chapter 2 will help you set up correctly.\n");
exitval = 1;
doexit();
}
#else /* no file system checking */
homedir = make_path(ep,"",0);
else
ep = homedir;
/* Replace each of the file name strings with the complete path */
if(cmdarg == NULLCHAR)
startup = make_path(ep,startup,1);
else
startup = make_path(ep,cmdarg,1);
userfile = make_path(ep,userfile,1);
hosts = make_path(ep,hosts,1);
alias = make_path(ep,alias,1);
#ifdef AX25
helpbox = make_path(ep,helpbox,1);
#endif
#ifdef _FINGER /* note that make_path() won't work on this one */
fingerpath = make_path(ep,fingerpath,1);
#endif
#if defined(AX25) && defined(MULPORT)
mdigilist = make_path(ep,mdigilist,1); /* GRAPES mulport code */
mexlist = make_path(ep,mexlist,1);
#endif
#ifdef UNIX
netexe = make_path(ep,"net",1);
#endif
if((ep = getenv("PUBLIC")) != NULLCHAR)
public = make_path(ep,"",0);
if((ep = getenv("NETSPOOL")) != NULLCHAR)
spool = make_path(ep,"",0);
mailspool = make_path(spool,mailspool,1);
mailqdir = make_path(spool,mailqdir,1);
mailqueue = make_path(spool,mailqueue,1);
routeqdir = make_path(spool,routeqdir,1);
#endif /* SKIP_FSCHECK */
}
int
dolog(argc,argv)
int argc;
char *argv[];
{
void free();
if(argc < 2){
if(logname != NULLCHAR)
printf("Log: %s. log off stops.\n",logname);
else
printf("Log off. log <fn> starts.\n");
return 0;
}
if(logname != NULLCHAR){
free(logname);
logname = NULLCHAR;
}
if(strcmp(argv[1],"off") == 0)
return 0;
if(argv[1][0] == '/' || argv[1][0] == '\\')
logname = make_path("",argv[1],0);
else
logname = make_path(homedir,argv[1],1);
return 0;
}
int
dohelp1(argc,argv)
int argc;
char *argv[];
{
void free();
char *pp;
int i;
char helpname[16]; /* should be big enough even for Unix */
char *defaulthelp = "net";
int dohelpfile();
int atoi();
if(argc < 2)
pp = defaulthelp;
else
pp = argv[1];
for(i=0;i<11;i++){
helpname[i] = pp[i];
if(helpname[i] == '\0')
break;
}
helpname[i] = '\0'; /* to be sure */
strcat(helpname,".hlp");
pp = make_path(homedir,helpname,1);
if(pp != NULLCHAR){ /* ignore return value - argv[2] added k34 */
dohelpfile(pp,argc > 2 ? LINES_PER_PAGE * atoi(argv[2]) : 0);
free(pp);
}
return 0;
}
/* primitive way to peek at our mail, page at a time */
int
domail(argc,argv)
int argc;
char *argv[];
{
void free();
int atoi();
char *pp;
char *mfname;
int i;
char hostmail[16]; /* should be big enough even for Unix */
mfname = argc < 2 ? hostname : argv[1];
for(i=0;i<11;i++){
if(mfname[i] == '.' || mfname[i] == '\0')
break;
hostmail[i] = mfname[i];
}
hostmail[i] = '\0';
strcat(hostmail,".txt");
pp = make_path(mailspool,hostmail,1);
/* note, put this message in the command table where it should be */
if(pp != NULLCHAR){
i = dohelpfile(pp,argc > 2 ? LINES_PER_PAGE * atoi(argv[2]): 0);
free(pp);
return i;
}
return 0; /* should we return error? */
}
int
dohelpfile(file,jump)
char *file;
int jump;
{
#define HFLINE 120 /* arbitrary, but this will keep
cycles down on long lines */
extern int Keyhit;
FILE *hfile;
extern char escape;
extern char nospace[];
char *hbuf;
int i;
void keep_things_going(),check_kbd(),free();
extern char linebuf[]; /* these 2 are in ttydriv.c */
extern char *kbcp;
Keyhit = -1;
if((hbuf = (char *)malloc(sizeof(char) * HFLINE)) == NULLCHAR){
perror(nospace);
return(0);
}
if((hfile = fopen(file,"r")) == NULLFILE){
printf("Can't find %s\n",file);
fflush(stdout);
free(hbuf);
return(-1);
}
if(jump)
for(i=0;i<jump;i++)
if(fgets(hbuf,HFLINE,hfile) == NULLCHAR){
fclose(hfile);
free(hbuf);
return(0);
}
for(;;){
for(i=0;i<LINES_PER_PAGE;i++){
if(fgets(hbuf,HFLINE,hfile) == NULLCHAR || hbuf[0] == 0x1a){
Keyhit = 0; /* fake an escape */
break;
}
printf("%s",hbuf); /* already has EOL appended */ /* k35 */
fflush(stdout);
keep_things_going();
}
if(Keyhit == 0)
break;
printf("\nHit any key to continue, ");
#ifdef UNIX
printf("escape key to quit...");
#else
printf("F10 to quit...");
#endif
fflush(stdout);
do{
keep_things_going();
#ifdef UNIX
Keyhit = kbread();
#else
check_kbd();
#endif
}while(Keyhit == -1);
#ifdef UNIX
if(Keyhit == escape)
#else
if(Keyhit == -2) /* the F10 key */
#endif
break;
Keyhit = -1;
printf("\n\n");
fflush(stdout);
} /* for(ever) while there is a file and no escape */
kbcp = linebuf; /* gobble up those keys we've been hitting */
printf("\n");
fflush(stdout);
fclose(hfile);
free(hbuf);
return(0);
}
/* If SOKNAME is defined, log messages of the form:
* Mon Aug 26 14:32:17 1991 k5jb.okla.ampr:1003 open FTP
* else:
* Mon Aug 26 14:32:17 1991 44.78.0.2:1003 open FTP
*/
/*VARARGS2*/
void
log(tcb,fmt,arg1,arg2,arg3,arg4)
struct tcb *tcb;
char *fmt;
int arg1,arg2,arg3,arg4;
{
time_t t,time();
void rip();
char *cp, *psocket();
#ifdef SOKNAME
char *puname();
#endif
if(logname == NULLCHAR)
return;
/* My Unix machine doesn't mind the "t" but some might */
#ifdef MSDOS
if((logfp = fopen(logname,"a+t")) == NULLFILE) /* can happen */
return;
#else
if((logfp = fopen(logname,"a+")) == NULLFILE)
return;
#endif
time(&t);
cp = ctime(&t);
cp[19] = '\0'; /* knock off the year, omit day below */
#ifdef AXMBX
if(tcb == (struct tcb *)0) /* from the mailbox */
fprintf(logfp,"%s Mbox - ",cp+4);
else
#endif
#ifdef SOKNAME
fprintf(logfp,"%s %s - ",cp+4,puname(&tcb->conn.remote));
#else
fprintf(logfp,"%s %s - ",cp+4,psocket(&tcb->conn.remote));
#endif
fprintf(logfp,fmt,arg1,arg2,arg3,arg4);
fprintf(logfp,"\n");
fflush(logfp);
fclose(logfp);
}
void
genlog(who,stuff)
char *who;
char *stuff;
{
extern FILE *logfp;
extern char *logname;
char *cp;
time_t t;
if(logname == NULLCHAR)
return;
#ifdef MSDOS
if((logfp = fopen(logname,"a+t")) == NULLFILE)
return;
#else
if((logfp = fopen(logname,"a+")) == NULLFILE)
return;
#endif
time(&t);
cp = ctime(&t);
cp[19] = '\0'; /* shorten a bit */
fprintf(logfp,"%s %s - %s\n",cp+4,who,stuff);
fclose(logfp);
}