ftp.nice.ch/pub/next/unix/communication/ft_bbs.1.0.s.tar.gz#/ft_bbs-1.0/bbsdstuff.c

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.