home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
lan
/
g0bsx
/
files.c
< prev
next >
Wrap
Text File
|
1989-05-26
|
9KB
|
425 lines
/*
* FILES.C - Server for the W0RLI MailBox V10.xx
*
* Copyright (C) 1989
* Peter Meiring
* 13 Venn Crescent,
* Hartley, Plymouth.
* PL3 5PJ
*
* This code may be freely used and copied for non-commercial uses.
*
* s files files.exe files.out H8 files.in H8
*
* See SERVER.DOC for further details.
*
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dir.h>
#include <ctype.h>
#include <string.h>
#define BUFSIZE 256
/*
* Copyright storage:
*/
char *copyright = "FILES 1.03 Copyright (c) Peter Meiring, G0BSX, 1989.\n";
/*
* Some buffer space.
*/
#define ln_buf 512
char buf[ln_buf];
/*
* End-of-message mark.
*/
char *mark = "/EX\n";
/*
* File used by this program to read initialisation Data
*/
char *datfile = "/bbs/config.mb";
/*
* File the MailBox will create, and this server will read.
*/
char *infile = "files.out";
/*
* File this server will create, and the MailBox will read.
*/
char *outfile = "files.in";
/*
* Data structures for the W0RLI filing system.
*/
static struct { char letter;
char path[80] ;
char name[80] ;
int ok ; } root[32];
static int ne;
/* Copy file */
copyfile(filename,fp)
FILE *fp;
char *filename;
{
int i, dn;
char *st, *n1, *n2;
FILE *datafile;
char tmp[128];
long nb, nl, ln;
for(dn=0;((root[dn].letter!=toupper(*filename))&&(dn < ne));dn++)
if( (dn == ne) || (root[dn].ok == 0) ) {
fprintf(fp,"Directory Area %c: not found\n",*filename);
return 1;
}
for(i=1;(ispunct(filename[i])||isspace(filename[i]));i++);
for(n1 = filename+i;((*n1!=' ')&&(*n1!='\0'));n1++);
if(*n1==' ') {
*n1++ = '\0';
while(*n1==' ') n1++ ; }
for(n2 = n1;((*n2!=' ')&&(*n2!='\0'));n2++);
if(*n2==' ') {
*n2++ = '\0';
while( *n2==' ' ) n2++; }
nb = atol(n1);
nl = atol(n2);
if(nl==0) {
if(nb==0) {
nb = 1L;
nl = 65535L; }
else {
nl = nb ;
nb = 1 ; } }
strcpy(tmp, root[dn].path);
strcat(tmp, filename+i);
fprintf(fp, "Full path: %s\n",tmp);
if ((datafile = fopen(tmp, "r")) == NULL) {
fprintf(fp,"File: %s not found \n", filename);
return 1;
}
fprintf(fp, "Directory: %c: %s\n File: %s",root[dn].letter,
root[dn].name, filename +i);
if ((atol(n1)!=0) && (atol(n2)==0))
fprintf(fp, " Lines 1 to %ld", nl);
else if((atol(n2)!=0))
fprintf(fp, " Lines %ld to %ld",nb,nl);
fprintf(fp, "\n\n");
st = fgets(buf, ln_buf, datafile) ;
ln = 1L;
while (st != NULL)
{
if((nb<=ln)&&(ln<=nl)) fputs(buf, fp);
st = fgets(buf, ln_buf, datafile);
ln++;
}
fclose(datafile);
return 0;
}
stripcr( line )
char *line;
{
int i;
for(i=1;i<strlen(line);i++)
if(line[i]=='\n')
line[i]='\0' ;
}
char *
skip(buf, fp)
char *buf;
FILE *fp;
{
char *sts;
sts = fgets( buf, ln_buf, fp);
while( ((*buf == ';') || (*buf == '\n')) && (sts != NULL))
sts = fgets(buf, ln_buf, fp) ;
return sts;
}
int getdirs()
{
FILE *fp;
int n;
char *st;
if((fp = fopen(datfile, "r")) == NULL) return -1;
/*
* Skip the first section of the config file.
*/
st = fgets(buf, ln_buf, fp);
while ( (strncmp(buf, "***", 3)) && (st != NULL))
st = fgets(buf, ln_buf, fp);
/*
* Read the files section (three lines per entry)
*/
st = skip(buf, fp);
n=0;
while( (strncmp(buf, "***", 3)) && (st != NULL)) {
/*
* Extract parameters
*/
root[n].letter = toupper(*buf);
/* if( index(buf, "D") > -1 || index(buf, "d") > -1 )
*/ root[n].ok = 1;
/* else
root[n].ok = 0;
*/ st = skip(buf, fp);
if (!strncmp(buf, "***",3) || (st == NULL)) return -1;
strcpy(root[n].path, buf);
stripcr(root[n].path);
st = skip(buf, fp);
if ((!strncmp(buf, "***", 3)) || (st == NULL)) return -1;
strcpy(root[n].name, buf);
stripcr(root[n].name);
st = skip(buf, fp);
n++;
}
fclose(datfile);
return n;
}
void
doroot(fp)
FILE *fp;
{
int dn;
fputs("Directories Available:\n",fp);
if( ne == 0 )
fputs("None!\n",fp);
else
for(dn=0;dn<ne;dn++)
fprintf(fp, "%c: %s\n",root[dn].letter, root[dn].name);
}
getdir( fp, name )
char *name;
FILE *fp;
{
struct ffblk *fbuf;
if( findfirst( name, fbuf, 0xFFFF ) == 0 )
printf("%12s %8ld\n", fbuf->ff_name, fbuf->ff_fsize);
while( findnext( fbuf ) == 0)
printf("%12s %8ld\n", fbuf->ff_name, fbuf->ff_fsize);
}
dodir(path,fp)
FILE *fp;
char *path;
{
char tmp[128];
int dn;
char dc;
dc = toupper(*path++);
/* while (*path && !isalpha(*path)) path++ ;
*/
for(dn=0;((root[dn].letter!=dc)&&(dn < ne));dn++) ;
if(dn>=ne) {
if (isalpha(dc))
fprintf(fp, "Directory Area: %c not found\n",dc);
else
doroot(fp);
return 0; }
fprintf(fp, "Directory Listing of %c: %s\n\n",dc, root[dn].name);
strcpy(tmp, root[dn].path);
/* if (*path) strcat(tmp, path) ;
else */
strcat(tmp,"*.*");
if (getdir(tmp,fp))
fprintf(fp,"Path: %s not found",tmp);
fprintf(fp,"\n");
return 0;
}
void
rfc822(from, to, subject, fp)
char *from, *to, *subject;
FILE *fp;
{
fprintf(fp, "From: %s", from);
fprintf(fp, "To: %s", to);
fprintf(fp, "Subject: Files Cmd: %s", subject);
fputs("\n", fp);
}
main(argc, argv)
int argc;
char *argv[];
{
FILE *in, *out;
char *st, *tail, *fname, *ptr, from[32], to[32], subject[64] ;
int n, ok;
/*
* Open and read the initialisation file: reqxxx.dat in the root directory
*/
ok = 0;
puts(copyright);
/*
* Initialise the Filing Database
*/
if ((ne = getdirs()) == -1) {
printf("FILES: Unexpected end of file in: %s\n", datfile);
exit(1);
}
/*
* Open the input file.
* If not possible, exit with return code 1 to signal
* the MailBox that the server failed.
*/
if ((in = fopen(infile, "r")) == NULL) exit(1);
/*
* Open the output file.
* If not possible, exit with return code 1 to signal
* the MailBox that the server failed.
*/
if ((out = fopen(outfile, "w")) == NULL) exit(1);
st = fgets(buf, ln_buf, in);
while (st != NULL)
{
/*
* Read the rfc-822 header placed into the message by the MailBox.
* The end of header is marked by a blank line.
*/
while(*buf != '\n')
{
/*
* Find end of keyword.
* Terminate string at end of keyword.
*/
tail = strchr(buf, ' ');
*tail++ = '\0';
/*
* Make the new rfc-822 header.
*/
if (!strcmp(buf, "To:")) strcpy(from, tail);
else if (!strcmp(buf, "From:")) strcpy(to, tail);
else if (!strcmp(buf, "Subject:")) {
strcpy(subject, tail);
strcpy( fname, tail); }
st = fgets(buf, ln_buf, in);
}
/*
* Now that the rfc-822 header has been read, and a new one created,
* copy the text of the message from the input to the output.
*/
stripcr(fname) ;
if( toupper(*fname) == 'W' ) {
rfc822(from, to, subject, out);
dodir(fname+1, out);
fputs(mark, out);
ok = 1; }
else if (toupper(*fname) == 'D' ) {
rfc822(from, to, subject, out);
copyfile(fname+1,out) ;
fputs(mark, out);
ok = 1; }
while ((st != NULL) && stricmp(buf, mark))
{
st = fgets(buf, ln_buf, in);
if( toupper(*buf) == 'W' ) {
strcpy(subject, buf);
stripcr(buf);
rfc822(from, to, subject, out);
dodir(buf+1, out);
fputs(mark, out);
ok = 1; }
else if (toupper(*buf) == 'D' ) {
strcpy(subject, buf);
stripcr(buf);
rfc822(from, to, subject, out);
copyfile(buf+1,out) ;
fputs(mark, out);
ok = 1; }
}
if( !ok ) {
rfc822(from, to, "NONE\n", out);
fputs("FILES: No valid command found in Subject or Message\n", out);
fputs(mark, out); }
/*
* Go on to the next message.
*/
if (st != NULL) st = fgets(buf, ln_buf, in);
}
/*
* All the incoming messages have been processed,
* and an outgoing message created for each one.
*/
fclose(in);
fclose(out);
/*
* Delete the input file.
* The MailBox appends messages to this file, this server must delete it.
*/
unlink(infile);
/*
* Exit with return code 0 to signal the MailBox that
* the server completed it's processing normally.
* The MailBox will then read our output file,
* and create messages from it.
*/
exit(0);
}