home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 January
/
usenetsourcesnewsgroupsinfomagicjanuary1994.iso
/
sources
/
misc
/
volume32
/
xbbs
/
part03
/
bbscfile.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-08
|
16KB
|
633 lines
/*
bbscfile.c
*/
/* #define DEBUG 1 */
#include "bbscdef.h"
#include <string.h>
#include <sys/types.h> /* For compatibility */
#include <sys/locking.h>
#define LASTDATE " 04/21/90 "
#define PGMNAME "BBSCFILE "
#define VERSION " 7.92 "
extern int user_priv;
static char bufmsg0[MSG1MAX+1],
buftmp[MSGSECT+256],
this1[11],
next1[11];
hdrwrt() /* write the header from memory variables */
{ /* header is a 1 record file */
int fd;
int fd1;
strcpy(who_am_i, m_pathname);
strcat(who_am_i, HEADER);
if ((fd = open(who_am_i,WRITE,0666)) < 0) /* open i/o */
{
portsout("Can't open header-file, will create it!") ;
portsout(CRLF) ;
if ((fd = creat(who_am_i,0666)) < 0)
{
portsout("Can't create header-file, aborting!") ;
portsout(CRLF) ;
return(ERROR) ;
}
}
lseek(fd, 0L, 0);
locking(fd, LK_LOCK, 0L);
strcpy(who_am_i, m_pathname);
strcat(who_am_i, CROSSREF);
if ((fd1 = open(who_am_i,WRITE,0666)) < 0)
{
portsout("Can't open xref file, will create it!");
portsout(CRLF) ;
if ((fd1 = creat(who_am_i,0666)) < 0)
{
portsout(" XREF creation error! -- abort!");
portsout(CRLF);
return(ERROR) ;
}
}
lseek(fd1, 0L, 0);
locking(fd1, LK_LOCK, 0L);
itoa(h_next_msg,h_next) ; /* convert int to char */
itoa(h_act_msg,h_act) ;
strfill(buf128,26,MSGSECT) ; /* init buf128 to all hex 1a */
sprintf(buf128,"%s~%s~%s~", /* build record */
h_next_msg,
h_act_msg,
h_date) ;
write(fd,buf128,MSGSECT) ; /* write it */
lseek(fd, 0L, 0);
locking(fd, LK_UNLCK, 0L);
close(fd) ; /* no need to leave it open */
write(fd1,xtable,4000);
lseek(fd1, 0L, 0);
locking(fd1, LK_UNLCK, 0L);
close(fd1) ;
return(OK) ;
}
hdrread() /* read the header file into memory */
{
int fd,
i,
cnt1,
cnt;
strcpy(who_am_i, m_pathname);
strcat(who_am_i, HEADER);
if ((fd = open(who_am_i,READ,0666)) < 0) /* open input */
{
portsout("Can't open header-file, using inital values!") ;
portsout(CRLF) ;
h_next = 1 ;
h_next_msg[0] = '1' ; h_next_msg[1] = 0 ;
h_act = 1 ;
h_act_msg[0] = '1' ; h_act_msg[1] = 0 ;
h_date[0] = '0' ; h_date[1] = 0 ;
hdrwrt() ; goto next;
}
lseek(fd, 0L, 0);
locking(fd, LK_LOCK, 0L);
if((cnt=read(fd,buf128,MSGSECT)) != MSGSECT)
{
portsout(CRLF) ;
portsout("<<< header read error >>>") ;
portsout(CRLF) ;
return(ERROR) ;
}
cnt = sscanf(buf128,"%[^~]~%[^~]~%[^~]~",
h_next_msg,
h_act_msg,
h_date) ;
next:
lseek(fd, 0L, 0);
locking(fd, LK_UNLCK, 0L);
close(fd) ; /* no need to leave it open */
strcpy(who_am_i, m_pathname);
strcat(who_am_i, CROSSREF);
if ((fd = open(who_am_i,READ,0666)) < 0)
{
portsout("Can't open xref file --- setting values!");
portsout(CRLF);
xtable[0] = 1L;
for (i = 1; i <= 999; i++)
xtable[i] = 0L;
return ;
}
lseek(fd, 0L, 0);
locking(fd, LK_LOCK, 0L);
if ((cnt1=read(fd, xtable, 4000)) != 4000)
{
portsout(CRLF) ;
portsout("<<< xref read error >>>");
portsout(CRLF);
return(ERROR);
}
lseek(fd, 0L, 0);
locking(fd, LK_UNLCK, 0L);
close (fd);
/*
if (cnt != 2)
{
return(ERROR) ;
}
*/
h_next = atoi(h_next_msg) ;
h_act = atoi(h_act_msg) ;
return(OK) ;
}
msgopen(how)
int how ; /* how to open 0=input, 1=output, 2=i/o */
{
int fd ;
strcpy(who_am_i, m_pathname);
strcat(who_am_i, MESSAGES);
if ((fd = open(who_am_i,how,0666)) < 0) /* open i/o */
{
portsout("can't open message-file, will create it!") ;
portsout(CRLF) ;
if ((fd = creat(who_am_i,0666)) < 0)
{
portsout("can't create message-file, aborting!") ;
portsout(CRLF) ;
return(ERROR) ;
}
}
lseek(fd, 0L, 0);
locking(fd, LK_RLCK, 0L);
return(fd) ;
}
msgclose(fd)
int fd ;
{
lseek(fd, 0L, 0);
locking(fd, LK_UNLCK, 0L);
return(close(fd)) ;
}
msgwrt(fd) /* write the message file from memory variables */
int fd; /* writes a message starting with the h_next msg # */
{
int rc, /* return code */
cnt1,
cnt2,
len;
rc = cnt1 = len = cnt2 = 0 ;
itoa(this1,h_next) ; /* convert int to char */
xtable[h_act - 1] = h_next;
for( len=h_act; len < 1000; len++)
xtable[len] = 0L; /* guarantee clean table */
h_act++;
rc = seek(fd,h_next - 1,0) ; /* seek next available sector */
h_next++ ;
itoa(next1,h_next) ;
strfill(buf128,0,MSGSECT) ; /* init buf128 to all hex 00 */
/*
* build first piece of msg record
*/
sprintf(buf128,"%-10s~%-10s~%-2s~%-9s~%-15s~%-21s~%-21s~%-11s~%-21s~",
this1, /* this rcd # */
next1, /* points next rcd # */
msg_delete, /* delete byte */
msg_date,
msg_time,
msg_to,
msg_from,
msg_pass,
msg_subject);
rc = write(fd,buf128,MSGSECT); /* write the first 128 byte record */
/* for a message record */
/*
* build the n+1 piece of msg record
*/
len = (strlen(msg_text) / MSG1MAX) + 1; /* calc how many more 128 */
/* byte records to write */
cnt2 = 1 ; /* init for substr */
while (len--)
{
itoa(this1,h_next); /* calc/convert record #'s */
h_next++;
if (len == 0)
{
strcpy(next1,"0"); /* marks last 128 byte piece */
} /* of a msg */
else
{
itoa(next1,h_next);
}
strfill(bufmsg0,0,MSG1MAX);
substr(msg_text,bufmsg0,cnt2,MSG1MAX); /* mv MSG1MAX to buff */
cnt2 += MSG1MAX; /* up cnt2 by MSG1MAX */
strfill(buf128,0,MSGSECT); /* init buf128 to all hex 00 */
sprintf(buf128,"%-10s~%-10s~%-2s~%-102s~",
this1, /* this rcd # */
next1, /* point to next rcd # */
msg_delete, /* delete byte */
bufmsg0); /* piece of msg */
rc = write(fd,buf128,MSGSECT); /* write n+1 128 byte record */
}
strfill(buf128,26,MSGSECT); /* fill with all hex 1a */
rc = write(fd,buf128,MSGSECT); /* write all hex 1a 128 byte record */
return(OK);
}
msgrewrt(fd,r_msg) /* re-write the message file from memory variables */
int fd, /* re-writes only the 1st part of a message */
r_msg; /* used to update the delete byte */
{
int rc, /* return code */
cnt1,
file_size;
rc = cnt1 = 0;
if (r_msg > h_next) /* don't try to seek past end of file */
{
return(ERROR);
}
if ((rc = seek(fd,r_msg-1,0)) == ERROR) /* seek to requested sector */
{
return(ERROR);
}
itoa(this1,r_msg); /* convert int to char */
r_msg++;
itoa(next1,r_msg);
strfill(buf128,0,MSGSECT); /* init buf128 to all hex 00 */
/*
* build first piece of msg record
*/
sprintf(buf128,"%-10s~%-10s~%-2s~%-9s~%-15s~%-21s~%-21s~%-11s~%-21s~",
this1, /* this rcd # */
next1, /* points next rcd # */
msg_delete, /* delete byte */
msg_date,
msg_time,
msg_to,
msg_from,
msg_pass,
msg_subject);
rc = write(fd,buf128,MSGSECT); /* write the first 128 byte record */
/* for a message record */
return(OK);
}
msgread(fd,msgno) /* read message number requested */
int fd, /* returns ERROR if msg past eof */
msgno; /* returns 0 if msg is not 1st piece */
/* of a message */
/* returns 0 if msg is deleted */
/* returns msg # if successful */
{
int rc, /* return code */
msgac,
cnt1,
cnt2,
len,
next,
ret_this,
file_size;
char act[11];
msgac = xtable[msgno - 1];
if (msgac > h_next) /* don't try to seek past end of file */
{
return(ERROR);
}
if (msgac == 0)
{
return(ERROR);
}
if ((rc = seek(fd,msgac-1,0)) == ERROR)
{
portsout(CRLF) ;
portsout("Can't seek on message-file!") ;
portsout(CRLF) ;
return(ERROR); /* when cant find it */
}
if (read(fd,buf128,MSGSECT) != MSGSECT) /* read 128 byte sector */
{
portsout(CRLF) ;
portsout("Can't read in message-file!") ;
portsout(CRLF) ;
return(ERROR);
}
/*
* get first piece of msg record
*/
/* do trial read, since if not first record, fields might overflow */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~",
buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp) ;
if (rc != 9) /* makes sure we read the 1st piece */
{ /* of a message and not in the middle */
return(0); /* 0 when is not the msg header */
}
/* now do the real read since looks like is a good record */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~",
this1, /* this rcd # */
next1, /* points to next rcd # */
msg_delete, /* delete byte */
msg_date,
msg_time,
msg_to,
msg_from,
msg_pass,
msg_subject);
if (rc != 9) /* makes sure we read the 1st piece */
{ /* of a message and not in the middle */
return(0); /* 0 when is not the msg header */
}
if (msg_delete[0] == '9') /* check for deleted messages */
{ /* if so, return as if not found */
return(0);
}
ret_this = atoi(this1); /* return this msg no. */
next = atoi(next1);
itoa(act,msgno);
strcpy(msg_no,act);
if(msg_delete[0] == '5')
{
strcat(msg_no,"*");
strcpy(msg_subject,"< Private Msg >");
}
msg_text[0] = '\0';
while (next) /* read until no more pieces for */
{ /* this message */
if (read(fd,buf128,MSGSECT) != MSGSECT) /* read next sector */
{
portsout(CRLF) ;
portsout("Can't read in message-file(2)!") ;
portsout(CRLF) ;
return(ERROR);
}
strfill(bufmsg0,0,MSG1MAX); /* init bufmsg0 to all hex 00 */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~",
this1, /* this rcd # */
next1, /* point to next rcd # */
msg_delete, /* delete byte */
bufmsg0); /* piece of msg */
next = atoi(next1);
strcat(msg_text,bufmsg0); /* tag piece of msg to */
/* whole msg array */
}
return(ret_this); /* if all ok, return the msg no. found */
}
msgreadx(fd,msgno) /* read message number requested */
int fd, /* returns ERROR if msg past eof */
msgno; /* returns 0 if msg is not 1st piece */
/* of a message */
/* returns 0 if msg is deleted */
/* returns msg # if successful */
{
int rc, /* return code */
msgac,
cnt1,
cnt2,
len,
next,
ret_this,
t1,
t2,
t3,
file_size;
char who_am_i[99],
who_am_I[99],
sysop[99],
Sysop[99],
act[11];
msgac = xtable[msgno - 1];
if (msgac > h_next) /* don't try to seek past end of file */
{
return(ERROR);
}
if (msgac == 0)
{
return(ERROR);
}
if ((rc = seek(fd,msgac-1,0)) == ERROR)
{
portsout(CRLF) ;
portsout("Can't seek on message-file!") ;
portsout(CRLF) ;
return(ERROR); /* when cant find it */
}
if (read(fd,buf128,MSGSECT) != MSGSECT) /* read 128 byte sector */
{
portsout(CRLF) ;
portsout("Can't read in message-file!") ;
portsout(CRLF) ;
return(ERROR);
}
/*
* get first piece of msg record
*/
/* do trial read, since if not first record, fields might overflow */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~",
buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp) ;
if (rc != 9) /* makes sure we read the 1st piece */
{ /* of a message and not in the middle */
return(0); /* 0 when is not the msg header */
}
/* now do the real read since looks like is a good record */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~",
this1,
next1, /* points to next rcd # */
msg_delete, /* delete byte */
msg_date,
msg_time,
msg_to,
msg_from,
msg_pass,
msg_subject);
if (rc != 9) /* makes sure we read the 1st piece */
{ /* of a message and not in the middle */
return(0); /* 0 when is not the msg header */
}
if (msg_delete[0] == '9') /* check for deleted messages */
{ /* if so, return as if not found */
return(0);
}
if (msg_delete[0] == '5') /* protected msg */
{
strcpy(who_am_i,w_fname);
strcat(who_am_i," ");
strcat(who_am_i,w_lname);
strcpy(Sysop,SYSOP);
sprintf(sysop,"%-21s",Sysop);
sprintf(who_am_I,"%-21s",who_am_i);
t1=strcmp(who_am_I,sysop);
t2=strcmp(who_am_I,msg_to);
t3=strcmp(who_am_I,msg_from);
if (t1 == 0 || t2 == 0 || t3 == 0 || user_priv == 32767)
{
goto zzzz;
}
return(-10);
}
zzzz:
ret_this = atoi(this1); /* return this msg no. */
next = atoi(next1);
itoa(act,msgno);
strcpy(msg_no,act);
msg_text[0] = '\0';
while (next) /* read until no more pieces for */
{ /* this message */
if (read(fd,buf128,MSGSECT) != MSGSECT) /* read next sector */
{
portsout(CRLF) ;
portsout("Can't read in message-file(2)!") ;
portsout(CRLF) ;
return(ERROR);
}
strfill(bufmsg0,0,MSG1MAX); /* init bufmsg0 to all hex 00 */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~",
this1, /* this rcd # */
next1, /* point to next rcd # */
msg_delete, /* delete byte */
bufmsg0); /* piece of msg */
next = atoi(next1);
strcat(msg_text,bufmsg0); /* tag piece of msg to */
/* whole msg array */
}
return(ret_this); /* if all ok, return the msg no. found */
}
msgreadk(fd,msgno) /* read message number requested */
int fd, /* returns ERROR if msg past eof */
msgno; /* returns 0 if msg is not 1st piece */
/* of a message */
/* returns 0 if msg is deleted */
/* returns msg # if successful */
{
int rc, /* return code */
msgac,
cnt1,
cnt2,
len,
next,
ret_this,
t1,
t2,
t3,
file_size;
char who_am_i[99],
who_am_I[99],
sysop[99],
Sysop[99],
act[11];
msgac = xtable[msgno - 1];
if (msgac > h_next) /* don't try to seek past end of file */
{
return(ERROR);
}
if (msgac == 0)
{
return(ERROR);
}
if ((rc = seek(fd,msgac-1,0)) == ERROR)
{
portsout(CRLF) ;
portsout("Can't seek on message-file!") ;
portsout(CRLF) ;
return(ERROR); /* when cant find it */
}
if (read(fd,buf128,MSGSECT) != MSGSECT) /* read 128 byte sector */
{
portsout(CRLF) ;
portsout("Can't read in message-file!") ;
portsout(CRLF) ;
return(ERROR);
}
/*
* get first piece of msg record
*/
/* do trial read, since if not first record, fields might overflow */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~",
buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp,buftmp) ;
if (rc != 9) /* makes sure we read the 1st piece */
{ /* of a message and not in the middle */
return(0); /* 0 when is not the msg header */
}
/* now do the real read since looks like is a good record */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~%[^~]~",
this1,
next1, /* points to next rcd # */
msg_delete, /* delete byte */
msg_date,
msg_time,
msg_to,
msg_from,
msg_pass,
msg_subject);
if (rc != 9) /* makes sure we read the 1st piece */
{ /* of a message and not in the middle */
return(0); /* 0 when is not the msg header */
}
if (msg_delete[0] == '9') /* check for deleted messages */
{ /* if so, return as if not found */
return(0);
}
strcpy(who_am_i,w_fname);
strcat(who_am_i," ");
strcat(who_am_i,w_lname);
strcpy(Sysop,SYSOP);
sprintf(sysop,"%-21s",Sysop);
sprintf(who_am_I,"%-21s",who_am_i);
t1=strcmp(who_am_I,sysop);
t2=strcmp(who_am_I,msg_to);
t3=strcmp(who_am_I,msg_from);
if (t1 == 0 || t2 == 0 || t3 == 0 || user_priv == 32767)
{
goto yyyy;
}
return(-10);
yyyy:
ret_this = atoi(this1); /* return this msg no. */
next = atoi(next1);
itoa(act,msgno);
strcpy(msg_no,act);
msg_text[0] = '\0';
while (next) /* read until no more pieces for */
{ /* this message */
if (read(fd,buf128,MSGSECT) != MSGSECT) /* read next sector */
{
portsout(CRLF) ;
portsout("Can't read in message-file(2)!") ;
portsout(CRLF) ;
return(ERROR);
}
strfill(bufmsg0,0,MSG1MAX); /* init bufmsg0 to all hex 00 */
rc = sscanf(buf128,"%[^~]~%[^~]~%[^~]~%[^~]~",
this1, /* this rcd # */
next1, /* point to next rcd # */
msg_delete, /* delete byte */
bufmsg0); /* piece of msg */
next = atoi(next1);
strcat(msg_text,bufmsg0); /* tag piece of msg to */
/* whole msg array */
}
return(ret_this); /* if all ok, return the msg no. found */
}
/* end of program */