This is bbsdstuff-com.c in view mode; [Download] [Up]
/* $Id: bbsdstuff-com.c,v 1.1 1995/12/19 19:30:47 eilts Exp eilts $ */
#include "bbs.h"
int bbslog(const int level, const confrecordtyp *confrecord,
const char *fmt, ...)
/*
Stellt einen String zusammen vom Format:
PID <pid>, <datum>: msg\n
und sendet ihn an den Daemon zum Eintragen in das Logfile,
dabei kann fuer 'fmt' ein Format wie fuer 'printf' eingesetzt werden,
zusaetzlich wird '%m' durch den aktuellen errno-String ersetzt.
Ist level==LOG_CONSOLE, so wird der Text zusaetzlich auf DEV_CONSOLE
ausgegeben,
ist level==LOG_NEVER, so wird nichts ausgegeben
errno wird erhalten
bbslog darf nicht vom Daemon (bbsd) aufgerufen werden
*/
{
va_list ap;
SIZE_T msglen;
int saved_errno, n=0, logs, logc;
char c, *cp1, *cp2, str[MSG_MAX+1], fmt_cpy[MSG_MAX+1];
if (level==LOG_NEVER) return 0;
saved_errno = errno;
if (bbsdaemon) {
bgerror("bbslog","bbslog cannot be used from daemon");
return(-2);
}
if ((logs=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","bbslog",
"connection to daemon failed");
exit(1);
}
sprintf(str,"#%2d\n",DO_LOG);
sendn(logs,(void *)str,(SIZE_T)BEFSTRLEN,0);
sprintf(str,"%.15s[%ld]: ",gettime()+4*sizeof(char),(long)getpid());
va_start(ap, fmt);
for (cp1=fmt_cpy; (c=*fmt)!='\0'; ++fmt) {
if (c=='%' && fmt[1]=='m') {
++fmt;
for (cp2=strerror(saved_errno); (*cp1=*cp2++)!='\0'; ++cp1);
}
else {
*cp1++ = c;
}
}
*cp1 = '\0';
for (cp1=str; *cp1!='\0'; ++cp1);
vsprintf(cp1,fmt_cpy,ap);
va_end(ap);
msglen = strlen(str) - 1;
if (str[msglen++]!='\n') {
str[msglen++] = '\n';
str[msglen] = '\0';
}
sendn(logs,(void *)&msglen,(SIZE_T)sizeof(SIZE_T),0);
sendn(logs,(void *)str,msglen,0);
recvn(logs,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(logs,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","bbslog",
"command bbslog wrongly executed by bbsd");
n = -1;
}
if (level==LOG_CONSOLE) {
if ((logc=open(DEV_CONSOLE,O_WRONLY))<0) {
errormsg(E_SYSLOG|E_USER,confrecord,"bbs","bbslog","open %s: %m",
DEV_CONSOLE);
n += -2;
}
else {
writen(logc,(void *)str,msglen);
close(logc);
}
}
errno = saved_errno;
return n;
}
int bbslogn(const int level, const confrecordtyp *confrecord,
const char *fmt, ...)
/*
Stellt einen String zusammen vom Format:
PID <pid>, <datum>: msg\n
und sendet ihn an den Daemon zum Eintragen in das Logfile,
dabei kann fuer 'fmt' ein Format wie fuer 'printf' eingesetzt werden,
zusaetzlich wird '%m' durch den aktuellen errno-String ersetzt.
Ist level==LOG_CONSOLE, so wird der Text zusaetzlich auf DEV_CONSOLE
ausgegeben,
ist level==LOG_NEVER, so wird nichts ausgegeben
errno wird erhalten
bbslogn darf nicht vom Daemon (bbsd) aufgerufen werden
*/
{
va_list ap;
SIZE_T msglen;
SSIZE_T maxmsglen;
int saved_errno, n=0, logs, logc;
char c, *cp1, *cp2, *str, *fmt_cpy;
if (level==LOG_NEVER) return 0;
saved_errno = errno;
if (bbsdaemon) {
bgerror("bbslogn","bbslogn cannot be used from daemon");
return(-2);
}
va_start(ap, fmt);
if ((maxmsglen=vfstrlen(fmt,ap)) < 0) {
bgerror("bbslogn","cannot guess memory");
return(-3);
}
maxmsglen += 100;
if ((str=(char *)malloc((SIZE_T)maxmsglen)) == NULL ||
(fmt_cpy=(char *)malloc((SIZE_T)maxmsglen)) == NULL) {
bgerror("bbslogn","cannot allocate memory");
return(-3);
}
if ((logs=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","bbslogn",
"connection to daemon failed");
exit(1);
}
sprintf(str,"#%2d\n",DO_LOG);
sendn(logs,(void *)str,(SIZE_T)BEFSTRLEN,0);
sprintf(str,"%.15s[%ld]: ",gettime()+4*sizeof(char),(long)getpid());
for (cp1=fmt_cpy; (c=*fmt)!='\0'; ++fmt) {
if (c=='%' && fmt[1]=='m') {
++fmt;
for (cp2=strerror(saved_errno); (*cp1=*cp2++)!='\0'; ++cp1);
}
else {
*cp1++ = c;
}
}
*cp1 = '\0';
for (cp1=str; *cp1!='\0'; ++cp1);
vsprintf(cp1,fmt_cpy,ap);
va_end(ap);
msglen = strlen(str) - 1;
if (str[msglen++]!='\n') {
str[msglen++] = '\n';
str[msglen] = '\0';
}
sendn(logs,(void *)&msglen,(SIZE_T)sizeof(SIZE_T),0);
sendn(logs,(void *)str,msglen,0);
recvn(logs,(void *)&n,(SIZE_T)sizeof(int),0);
unconnect2bbsd(logs,confrecord);
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","bbslog",
"command bbslogn wrongly executed by bbsd");
n = -1;
}
if (level==LOG_CONSOLE) {
if ((logc=open(DEV_CONSOLE,O_WRONLY))<0) {
errormsg(E_SYSLOG|E_USER,confrecord,"bbs","bbslogn","open %s: %m",
DEV_CONSOLE);
n += -2;
}
else {
writen(logc,(void *)str,msglen);
close(logc);
}
}
free((void *)str);
free((void *)fmt_cpy);
errno = saved_errno;
return n;
}
int getsessions(sessionrecordtyp sessionrecords[], const int maxn,
const confrecordtyp *confrecord)
/*
Erfragt vom Daemon alle sessionrecords der laufenden bbs und gibt sie
in sessionrecords zurueck, der Rueckgabewert von getsessions ist die
Anzahl der sessions.
maxn begrenzt die maximale Anzahl der sessions
*/
{
int sockd, n=-1;
char bstr[BEFSTRLEN+1];
sessionrecordtyp sr;
if ((sockd=connect2bbsd(confrecord))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","getsessions",
"connection to daemon failed");
exit(1);
}
sprintf(bstr,"#%2d\n",DO_GETSESSIONS);
sendn(sockd,(void *)bstr,(SIZE_T)BEFSTRLEN,0);
if (maxn>0) {
do {
n++;
recvn(sockd,(void *)&(sessionrecords[n]),(SIZE_T)sizeof(sessionrecordtyp),0);
} while (sessionrecords[n].pid!=0 && n<maxn-1);
sr.pid = sessionrecords[n].pid;
}
else {
sr.pid = 1;
}
while (sr.pid!=0) {
recvn(sockd,(void *)&sr,(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","getsessions",
"command getsessions wrongly executed by bbsd");
return -1;
}
return n;
}
int connect2bbsd(const confrecordtyp *confrecord)
/*
Stellt eine Verbindung zum Daemon (bbsd) her, der Deskriptor wird als
Rueckgabewert geliefert.
Die meisten Signale werden blockiert, wird in unconnect2bbsd restauriert
*/
{
int sockd, len, k, n;
static PID_T pid = 0;
struct sockaddr_un saun;
SIGSET_T sigset;
if (pid == 0) pid = getpid();
if (blocksigsetstatus == SIGMASK_UNSET) {
sigfillset(&sigset);
sigprocmask(SIG_SETMASK,&sigset,&old_blocksigset);
blocksigsetstatus = SIGMASK_SET;
}
else {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","connect2bbsd",
"WARNING: old_blocksigset is in use");
}
if ((sockd=socket(AF_UNIX,SOCK_STREAM,0))<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","connect2bbsd",
"socket %s: %m",confrecord->sockpath);
return -1;
}
BZERO(&saun, sizeof(saun));
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path,confrecord->sockpath);
len = SUN_LEN(&saun);
#ifdef SCM_RIGHTS
saun.sun_len = len;
#endif
k = 0;
while ((n=connect(sockd,(struct sockaddr *)&saun,len))<0 && k<SOCKCONTRIES) {
k++;
sleep(1);
}
if (n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","connect2bbsd",
"connect %s: %m",confrecord->sockpath);
return n;
}
sendn(sockd,(void *)&pid,(SIZE_T)sizeof(PID_T),0);
n = strlen(confrecord->authkey) + 1;
sendn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
sendn(sockd,(void *)confrecord->authkey,(SIZE_T)n,0);
k = recvn(sockd,(void *)&n,(SIZE_T)sizeof(int),0);
if (k<0 || n<0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","connect2bbsd",
"wrong authorisation");
return n;
}
return sockd;
}
int unconnect2bbsd(const int sockd, const confrecordtyp *confrecord)
{
if (blocksigsetstatus == SIGMASK_SET) {
blocksigsetstatus = SIGMASK_UNSET;
sigprocmask(SIG_SETMASK,&old_blocksigset,NULL);
}
else {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","unconnect2bbsd",
"WARNING: old_blocksigset is not set (nothing done)");
}
return close(sockd);
}
PID_T testdaemon(const char *bbsdpidpath, const confrecordtyp *confrecord)
/*
Prueft die Existenz eines Daemons
Rueckgabewerte: 0, wenn kein Pidfile vom Daemon existiert
-1, wenn Pidfile existiert, aber nicht lesbar ist
-2, wenn Pidfile existiert, Muell drinsteht
-3, wenn Pidfile existiert, aber kill -1 liefert
pid des Daemons sonst
*/
{
PID_T pid;
int fd;
SSIZE_T ss;
char str[S_STRLEN+1];
if (access(bbsdpidpath,F_OK) == 0) {
if ((fd=open(bbsdpidpath,O_RDONLY)) < 0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","testdaemon",
"open %s: %m",bbsdpidpath);
return(-1);
}
if ((ss=readn(fd,(void *)str,(SIZE_T)S_STRLEN)) < 0) {
errormsg(E_SYSLOG|E_USER|E_CONSOLE,confrecord,"bbs","testdaemon",
"read %s: %m",bbsdpidpath);
return(-1);
}
close(fd);
if (ss == (SSIZE_T)S_STRLEN) {
return(-2);
}
pid = (PID_T)atoi(str);
if (kill(pid,0) < 0) {
if (errno != EPERM) {
pid = -3;
}
}
}
else {
pid = 0;
}
return pid;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.