This is bbsdstuff.c in view mode; [Download] [Up]
/* $Id: bbsdstuff.c,v 1.2 1995/12/19 19:30:47 eilts Exp eilts $ */
#include "bbs.h"
#ifdef NNTPNEWS
int getnewsrc(tlistetyp **tliste, const confrecordtyp *confrecord)
{
int sockd, n, anz=0;
SIZE_T len;
char bstr[BEFSTRLEN+1], str[S_STRLEN+1];
const char *name;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getnewsrc",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_GETNEWSRC);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
name = confrecord->userrecord.name;
len = strlen(name) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)name,len,0);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
while (len > 0) {
recvn(sockd,(void *)str,len,0);
addstrtoliste(tliste,TRUE,anz++,TL_BLOCKLEN,str,confrecord);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
}
recvn(sockd,(void *)&n,sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n >= 0) n = anz;
return(n);
}
int savenewsrc(tlistetyp *tliste, const int anz,
const confrecordtyp *confrecord)
{
int sockd, n;
SIZE_T len;
char bstr[BEFSTRLEN+1], *sp;
const char *name;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","savenewsrc",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_SAVENEWSRC);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
name = confrecord->userrecord.name;
len = strlen(name) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)name,len,0);
for (n=0; n < anz; n++) {
readliste(&tliste,FALSE,n,TL_BLOCKLEN,&sp,confrecord);
len = strlen(sp) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)sp,len,0);
}
len = 0;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
recvn(sockd,(void *)&n,sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
return(n);
}
int getallnewsgroups(tlistetyp **tliste, const int mask,
const confrecordtyp *confrecord)
{
int n, anz, sockd;
SIZE_T len;
char bstr[BEFSTRLEN+1], entry[STRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getallnewsgroups",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_GETALLNEWSGROUPS);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)&mask,sizeof(int),0);
anz = 0;
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
while (len > 0) {
recvn(sockd,(void *)entry,len,0);
addstrtoliste(tliste,TRUE,anz++,TL_BLOCKLEN,entry,confrecord);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
}
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n >= 0) n = anz;
return(n);
}
int checkgroup(const char *group, const confrecordtyp *confrecord)
{
int n, sockd;
SIZE_T len;
char bstr[BEFSTRLEN+1];
boolean grp_exists = FALSE;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","checkgroup",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_CHECKGROUP);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
len = strlen(group) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)group,len,0);
recvn(sockd,(void *)&grp_exists,(SIZE_T)sizeof(boolean),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n == 0 && grp_exists) n = 1;
return n;
}
#endif
int listmessages(tlistetyp **tliste, const confrecordtyp *confrecord)
{
int sockd, n, anz=0;
SIZE_T len;
char bstr[BEFSTRLEN+1], hdrlines[3*STRLEN+4];
const char *name;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","listmessages",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_LISTMESSAGES);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
name = confrecord->userrecord.name;
len = strlen(name) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)name,len,0);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
while (len > 0) {
recvn(sockd,(void *)hdrlines,len,0);
addstrtoliste(tliste,TRUE,anz++,TL_BLOCKLEN,hdrlines,confrecord);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
}
recvn(sockd,(void *)&n,sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n >= 0) n = anz;
return(n);
}
int removemessage(const int nr, const char *mesg_id,
const confrecordtyp *confrecord)
{
int sockd, n;
SIZE_T len;
char bstr[BEFSTRLEN+1];
const char *name;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","removemessage",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_REMOVEMESSAGE);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
name = confrecord->userrecord.name;
len = strlen(name) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)name,len,0);
sendn(sockd,(void *)&nr,sizeof(int),0);
len = strlen(mesg_id) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)mesg_id,len,0);
recvn(sockd,(void *)&n,sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
return(n);
}
int getmessage(char mpath[], const int nr, const char *mesg_id,
const confrecordtyp *confrecord)
{
int sockd, n;
SIZE_T len;
char bstr[BEFSTRLEN+1];
const char *name;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getmessage",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_GETMESSAGE);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
name = confrecord->userrecord.name;
len = strlen(name) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)name,len,0);
sendn(sockd,(void *)&nr,sizeof(int),0);
len = strlen(mesg_id) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)mesg_id,len,0);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
if (len > 0) {
recvn(sockd,(void *)mpath,len,0);
}
else {
mpath[0] = '\0';
}
recvn(sockd,(void *)&n,sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n >= 0) n = len - 1;
return(n);
}
int sendmessage(const char *from, const char *addr, const char *subject,
const char *letter, const confrecordtyp *confrecord)
{
int sockd, letterfd, n, rw=0;
SIZE_T len;
SSIZE_T bytes;
char bstr[BEFSTRLEN+1], buf[BUFSIZE];
struct stat stats;
if (stat(letter,&stats) < 0) {
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","sendmessage",
"stat %d: %m", letter);
return -1;
}
if ((letterfd=open(letter,O_RDONLY)) < 0) {
errormsg(E_LOGFILE|E_USER,confrecord,"bbs","sendmessage",
"open letter %s: %m", letter);
return -1;
}
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","sendmessage",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_SENDMESSAGE);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
len = strlen(from) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)from,len,0);
len = strlen(addr) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)addr,len,0);
len = strlen(subject) + 1;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
sendn(sockd,(void *)subject,len,0);
len = (SIZE_T)stats.st_size;
sendn(sockd,(void *)&len,sizeof(SIZE_T),0);
bytes = 0;
while (len > 0 && bytes >= 0 &&
(bytes=read(letterfd,(void *)buf,(SIZE_T)BUFSIZE)) > 0) {
bytes = sendn(sockd,(void *)buf,bytes,0);
len -= (SIZE_T)bytes;
}
close(letterfd);
do {
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
if (n > 1) {
recvn(sockd,(void *)addr,(SIZE_T)n,0);
errormsg(E_USER,confrecord,"bbs","sendmessage",addr);
}
} while (n > 0);
unconnect2bbsd(sockd,confrecord);
if (bytes < 0 || n < 0) {
rw = -1;
}
else {
unlink(letter);
}
return(rw);
}
int getallusernames(tlistetyp **tliste, const int mask,
const confrecordtyp *confrecord)
{
int n, anz, sockd;
SIZE_T len;
char bstr[BEFSTRLEN+1], user[2*S_STRLEN+4];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getallusernames",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_GETALLUSERNAMES);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)&mask,sizeof(int),0);
anz = 0;
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
while (len > 0) {
recvn(sockd,(void *)user,len,0);
addstrtoliste(tliste,TRUE,anz++,TL_BLOCKLEN,user,confrecord);
recvn(sockd,(void *)&len,sizeof(SIZE_T),0);
}
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n >= 0) n = anz;
return(n);
}
int iniconnecttouserd(const PID_T inipid, const PID_T remotepid,
char *sockname, const confrecordtyp *confrecord)
{
int n, sockd;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","iniconnecttouserd",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_TALKINIT);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)&inipid,(SIZE_T)sizeof(PID_T),0);
sendn(sockd,(void *)&remotepid,(SIZE_T)sizeof(PID_T),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
if (n == 0) {
recvn(sockd,(void *)sockname,(SIZE_T)TALKSOCKNAMELEN,0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
}
unconnect2bbsd(sockd,confrecord);
return(n);
}
int remconnecttouserd(sessionrecordtyp *sr, char *sockname, const PID_T mypid,
const confrecordtyp *confrecord)
{
int n, sockd;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","remconnecttouserd",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_TALKREMOTE);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)&mypid,(SIZE_T)sizeof(PID_T),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
if (n == 0) {
recvn(sockd,(void *)sockname,(SIZE_T)TALKSOCKNAMELEN,0);
recvn(sockd,(void *)sr,(SIZE_T)sizeof(sessionrecordtyp),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
}
unconnect2bbsd(sockd,confrecord);
return(n);
}
int sendstatustodaemon(const int status, const confrecordtyp *confrecord)
{
int sockd, n;
PID_T pid;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","sendstatustodaemon",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_SENDSTATUS);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
pid = getpid();
sendn(sockd,(void *)&pid,(SIZE_T)sizeof(PID_T),0);
sendn(sockd,(void *)&status,(SIZE_T)sizeof(int),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","sendstatustodaemon",
"command endstatustodaemon wrongly executed by bbsd");
return -1;
}
return n;
}
int addsession(const sessionrecordtyp *sessionrecord,
const confrecordtyp *confrecord)
/*
Sendet sessionrecord zum Eintragen zum Daemon
*/
{
int n, sockd;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","addsession",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_ADDSESSION);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)sessionrecord,(SIZE_T)sizeof(sessionrecordtyp),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","addsession",
"command addsession wrongly executed by bbsd");
return -1;
}
return 0;
}
int removesession(const PID_T pid, const confrecordtyp *confrecord)
/*
Sendet pid zum Loeschen der zugehoerigen session zum Daemon
*/
{
int n, sockd;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","removebbspid",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_REMOVESESSION);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)&pid,(SIZE_T)sizeof(PID_T),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","removebbspid",
"command removesession wrongly executed by bbsd");
return -1;
}
return 0;
}
boolean getuserrecord(userrecordtyp *userrecord, const char *username,
const confrecordtyp *confrecord)
/*
Erfragt den Userrecord des Users username vom Daemon
Der Rueckgabewert von getuserrecord ist FALSE, wenn der User nicht existiert
*/
{
int n, sockd;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getuserrecord",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_GETUSERRECORD);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)username,(SIZE_T)S_STRLEN,0);
n = (int)recvn(sockd,(void *)userrecord,(SIZE_T)sizeof(userrecordtyp),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getuserrecord",
"command getuserrecord wrongly executed by bbsd");
return FALSE;
}
return (n==0);
}
int saveuserrecord(const userrecordtyp *userrecord,
const confrecordtyp *confrecord)
/*
Sendet den Userrecord userrecord zum Daemon, der ihn dann im Userfile
permanent speichern soll
*/
{
int n, sockd;
char bstr[BEFSTRLEN+1];
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","saveuserrecord",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_SAVEUSERRECORD);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
sendn(sockd,(void *)userrecord,(SIZE_T)sizeof(userrecordtyp),0);
recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(sockd,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","saveuserrecord",
"command saveuserrecord wrongly executed by bbsd");
return FALSE;
}
return (n==0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.