Made several functions multithreat aware

This commit is contained in:
Michiel Broek 2006-01-30 22:27:02 +00:00
parent 90bd1a495c
commit 595a6a0322
17 changed files with 280 additions and 234 deletions

View File

@ -6,7 +6,7 @@ v0.83.11 28-Jan-2006
Added logging for possible detection of dialup IBC neighbour
address change.
Added experimental restart for changed resolved FQDN.
Made logging multithread aware.
Made several functions multithread aware.
v0.83.10 25-Jan-2006 - 28-Jan-2006

View File

@ -62,6 +62,9 @@ int check_calllist(void)
{
int i, found, call_work;
struct _alist *tmp;
char *buf;
buf = calloc(81, sizeof(char));
/*
* Check callist, remove obsolete entries.
@ -77,7 +80,8 @@ int check_calllist(void)
}
}
if (!found) {
Syslog('c', "Removing slot %d node %s from calllist", i, fido2str(calllist[i].addr, 0x01f));
fido2str_r(calllist[i].addr, 0x01f, buf);
Syslog('c', "Removing slot %d node %s from calllist", i, buf);
memset(&calllist[i], 0, sizeof(tocall));
}
}
@ -112,7 +116,8 @@ int check_calllist(void)
if (!found) {
for (i = 0; i < MAXTASKS; i++) {
if (!calllist[i].addr.zone) {
Syslog('c', "Adding %s to calllist slot %d", fido2str(tmp->addr, 0x1f), i);
fido2str_r(tmp->addr, 0x1f, buf);
Syslog('c', "Adding %s to calllist slot %d", buf, i);
calllist[i].addr = tmp->addr;
calllist[i].cst = tmp->cst;
calllist[i].callmode = tmp->callmode;
@ -138,12 +143,14 @@ int check_calllist(void)
Syslog('c', "---- ----- ----- --- ------- ------- -------- -------- -------- ----------------");
}
call_work++;
fido2str_r(calllist[i].addr, 0x1f, buf);
Syslog('c', "%4d %s %5d %3d %s %s %08x %08x %08x %s", i, calllist[i].calling?"true ":"false", calllist[i].taskpid,
calllist[i].cst.tryno, callstatus(calllist[i].cst.trystat), callmode(calllist[i].callmode),
calllist[i].moflags, calllist[i].diflags, calllist[i].ipflags, fido2str(calllist[i].addr, 0x1f));
calllist[i].moflags, calllist[i].diflags, calllist[i].ipflags, buf);
}
}
free(buf);
return call_work;
}

View File

@ -4,7 +4,7 @@
* Purpose ...............: Read mailer last call status
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2006
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -37,10 +37,9 @@
extern struct sysconfig CFG;
char *stsname(faddr *);
char *stsname(faddr *addr)
void stsname_r(faddr *, char *);
void stsname_r(faddr *addr, char *buf)
{
static char buf[PATH_MAX];
char *p, *domain=NULL, zpref[8];
int i;
@ -106,26 +105,29 @@ char *stsname(faddr *addr)
if (domain)
free(domain);
return buf;
return;
}
callstat *getstatus(faddr *addr)
void getstatus_r(faddr *addr, callstat *cst)
{
static callstat cst;
FILE *fp;
FILE *fp;
char *temp;
cst.trytime = 0;
cst.tryno = 0;
cst.trystat = 0;
cst->trytime = 0;
cst->tryno = 0;
cst->trystat = 0;
temp = calloc(PATH_MAX, sizeof(char));
stsname_r(addr, temp);
if ((fp = fopen(stsname(addr), "r"))) {
fread(&cst, sizeof(callstat), 1, fp);
if ((fp = fopen(temp, "r"))) {
fread(cst, sizeof(callstat), 1, fp);
fclose(fp);
}
free(temp);
return &cst;
return;
}

View File

@ -11,6 +11,6 @@ typedef struct _callstat {
} callstat;
callstat *getstatus(faddr*);
void getstatus_r(faddr *, callstat *);
#endif

View File

@ -472,7 +472,10 @@ pid_t launch(char *cmd, char *opts, char *name, int tasktype)
return 0;
case 0:
/* From Paul Vixies cron: */
(void)setsid(); /* It doesn't seem to help */
rc = setsid(); /* It doesn't seem to help */
if (rc == -1)
Syslog('?', "$Launch: setsid()");
close(0);
if (open("/dev/null", O_RDONLY) != 0) {
Syslog('?', "$Launch: \"%s\": reopen of stdin to /dev/null failed", buf);
@ -718,7 +721,7 @@ void die(int onsig)
*/
count = 30;
while (count) {
snprintf(temp, 80, "%s", reg_fre());
reg_fre_r(temp);
if (strcmp(temp, "100:0;") == 0) {
Syslog('+', "Good, no more other programs running");
break;
@ -1163,13 +1166,9 @@ void *scheduler(void)
* Reload configuration data if some file is changed.
*/
now = time(NULL);
#if defined(__OpenBSD__)
localtime_r(&now, &tm);
gmtime_r(&now, &utm);
#else
tm = *localtime(&now);
utm = *gmtime(&now);
#endif
if (tm.tm_min != olddo) {
/*
* Each minute we execute this part

View File

@ -4,7 +4,7 @@
* Purpose ...............: mbtask - Scan mail outbound status
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2006
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -96,17 +96,15 @@ int load_node(fidoaddr n)
char *size_str(int);
char *size_str(int size)
void size_str_r(int, char *);
void size_str_r(int size, char *fmt)
{
static char fmt[25];
if (size > 1048575) {
snprintf(fmt, 25, "%dK", size / 1024);
} else {
snprintf(fmt, 25, "%d ", size);
}
return fmt;
return;
}
@ -119,11 +117,7 @@ void set_next(int hour, int min)
int uhour, umin;
now = time(NULL);
#if defined(__OpenBSD__)
gmtime_r(&now, &etm);
#else
etm = *gmtime(&now);
#endif
uhour = etm.tm_hour; /* For some reason, these intermediate integers are needed */
umin = etm.tm_min;
@ -185,15 +179,18 @@ char *callmode(int mode)
*/
void checkdir(char *boxpath, faddr *fa, char flavor)
{
char *temp;
char *temp, *buf;
DIR *dp = NULL;
struct dirent *de;
struct stat sb;
struct passwd *pw;
temp = calloc(PATH_MAX, sizeof(char));
buf = calloc(PATH_MAX, sizeof(char));
pw = getpwnam((char *)"mbse");
Syslog('o', "check filebox %s (%s) flavor %c", boxpath, ascfnode(fa, 0xff), flavor);
ascfnode_r(fa, 0xff, buf);
Syslog('o', "check filebox %s (%s) flavor %c", boxpath, buf, flavor);
free(buf);
if ((dp = opendir(boxpath)) != NULL) {
while ((de = readdir(dp))) {
@ -258,7 +255,7 @@ int outstat()
{
int rc, first = TRUE, T_window, iszmh = FALSE;
struct _alist *tmp, *old;
char digit[6], flstr[13], *temp, as[6], be[6], utc[6], flavor, *temp2;
char digit[6], flstr[13], *temp, as[6], be[6], utc[6], flavor, *temp2, *fmt, *buf;
time_t now;
struct tm tm;
int uhour, umin, thour, tmin;
@ -280,11 +277,7 @@ int outstat()
itnmask = (*tmpm)->mask;
}
now = time(NULL);
#if defined(__OpenBSD__)
gmtime_r(&now, &tm);
#else
tm = *gmtime(&now); /* UTC time */
#endif
gmtime_r(&now, &tm); // UTC time
uhour = tm.tm_hour;
umin = tm.tm_min;
snprintf(utc, 6, "%02d:%02d", uhour, umin);
@ -671,7 +664,10 @@ int outstat()
* Here we are out of options, clear callflag.
*/
if (tmp->callmode == CM_NONE) {
Syslog('!', "No method to call %s available", fido2str(tmp->addr, 0x0f));
buf = calloc(81, sizeof(char));
fido2str_r(tmp->addr, 0x0f, buf);
Syslog('!', "No method to call %s available", buf);
free(buf);
tmp->flavors &= ~F_CALL;
}
}
@ -687,11 +683,17 @@ int outstat()
/*
* Show callresult for this node.
*/
snprintf(temp, PATH_MAX, "%s %8s %08x %08x %08x %08x %5d %s %s %s", flstr, size_str(tmp->size),
fmt = calloc(81, sizeof(char));
buf = calloc(81, sizeof(char));
size_str_r(tmp->size, fmt);
fido2str_r(tmp->addr, 0x0f, buf);
snprintf(temp, PATH_MAX, "%s %8s %08x %08x %08x %08x %5d %s %s %s", flstr, fmt,
(unsigned int)tmp->olflags, (unsigned int)tmp->moflags,
(unsigned int)tmp->diflags, (unsigned int)tmp->ipflags,
tmp->cst.tryno, callstatus(tmp->cst.trystat), callmode(tmp->callmode), fido2str(tmp->addr, 0x0f));
tmp->cst.tryno, callstatus(tmp->cst.trystat), callmode(tmp->callmode), buf);
Syslog('+', "%s", temp);
free(fmt);
free(buf);
} /* All nodes scanned. */
@ -733,7 +735,7 @@ int each(faddr *addr, char flavor, int isflo, char *fname)
struct _alist **tmp;
struct stat st;
FILE *fp;
char buf[256], *p;
char buf[256], *p, *buf2;
node *nlent;
callstat *cst;
@ -788,10 +790,12 @@ int each(faddr *addr, char flavor, int isflo, char *fname)
(*tmp)->size = 0L;
}
cst = getstatus(addr);
cst = malloc(sizeof(callstat));
getstatus_r(addr, cst);
(*tmp)->cst.trytime = cst->trytime;
(*tmp)->cst.tryno = cst->tryno;
(*tmp)->cst.trystat = cst->trystat;
free(cst);
if ((isflo == OUT_FLO) || (isflo == OUT_PKT) || (isflo == OUT_FIL))
switch (flavor) {
@ -833,7 +837,9 @@ int each(faddr *addr, char flavor, int isflo, char *fname)
p++;
if (stat(p, &st) != 0) {
if (strlen(CFG.dospath)) {
if (stat(Dos2Unix(p), &st) != 0) {
buf2 = calloc(PATH_MAX, sizeof(char));
Dos2Unix_r(p, buf2);
if (stat(buf2, &st) != 0) {
/*
* Fileattach dissapeared, maybe
* the node doesn't poll enough and
@ -842,6 +848,7 @@ int each(faddr *addr, char flavor, int isflo, char *fname)
st.st_size = 0L;
st.st_mtime = time(NULL);
}
free(buf2);
} else {
if (stat(p, &st) != 0) {
st.st_size = 0L;

View File

@ -90,6 +90,7 @@ char *exe_cmd(char *in)
static char ebuf[19];
static char *cnt, var1[16];
int result;
char *buf;
strcpy(ibuf, in);
strncpy(cmd, ibuf, 4);
@ -253,7 +254,11 @@ char *exe_cmd(char *in)
* 100:0;
*/
if (strncmp(cmd, "CIPM", 4) == 0) {
return reg_ipm(token);
buf = calloc(SS_BUFSIZE, sizeof(char));
reg_ipm_r(token, buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -312,7 +317,11 @@ char *exe_cmd(char *in)
* 100:0; No page active
*/
if (strncmp(cmd, "CCKP", 4) == 0) {
return reg_checkpage(token);
buf = calloc(SS_BUFSIZE, sizeof(char));
reg_checkpage_r(token, buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -395,7 +404,11 @@ char *exe_cmd(char *in)
* 100:1,3; Error
*/
if (strncmp(cmd, "DSPC", 4) == 0) {
return disk_check(token);
buf = calloc(SS_BUFSIZE, sizeof(char));
disk_check_r(token, buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -403,7 +416,11 @@ char *exe_cmd(char *in)
* 100:n,data1,..,data10;
*/
if (strncmp(cmd, "DGFS", 4) == 0) {
return disk_getfs();
buf = calloc(SS_BUFSIZE, sizeof(char));
disk_getfs_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -442,7 +459,11 @@ char *exe_cmd(char *in)
* 201:1,16;
*/
if (strncmp(cmd, "GSTA", 4) == 0) {
return stat_status();
buf = calloc(SS_BUFSIZE, sizeof(char));
stat_status_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -453,7 +474,11 @@ char *exe_cmd(char *in)
if (strncmp(cmd, "GMON", 4) == 0) {
cnt = strtok(token, ",");
strcpy(var1, strtok(NULL, ";"));
return get_reginfo(atoi(var1));
buf = calloc(SS_BUFSIZE, sizeof(char));
get_reginfo_r(atoi(var1), buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -461,7 +486,11 @@ char *exe_cmd(char *in)
* 100:n,data1,..,data10;
*/
if (strncmp(cmd, "GDST", 4) == 0) {
return disk_getfs();
buf = calloc(SS_BUFSIZE, sizeof(char));
disk_getfs_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -470,7 +499,11 @@ char *exe_cmd(char *in)
* 201:1,16;
*/
if (strncmp(cmd, "GSYS", 4) == 0) {
return get_sysinfo();
buf = calloc(SS_BUFSIZE, sizeof(char));
get_sysinfo_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -478,7 +511,11 @@ char *exe_cmd(char *in)
* 100:1,n;
*/
if (strncmp(cmd, "GLCC", 4) == 0) {
return get_lastcallercount();
buf = calloc(SS_BUFSIZE, sizeof(char));
get_lastcallercount_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -489,7 +526,11 @@ char *exe_cmd(char *in)
if (strncmp(cmd, "GLCR", 4) == 0) {
cnt = strtok(token, ",");
strcpy(var1, strtok(NULL, ";"));
return get_lastcallerrec(atoi(var1));
buf = calloc(SS_BUFSIZE, sizeof(char));
get_lastcallerrec_r(atoi(var1), buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
@ -536,7 +577,11 @@ char *exe_cmd(char *in)
* 201:1,16;
*/
if (strncmp(cmd, "SFRE", 4) == 0) {
return reg_fre();
buf = calloc(SS_BUFSIZE, sizeof(char));
reg_fre_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -545,7 +590,11 @@ char *exe_cmd(char *in)
* 200:1,16;
*/
if (strncmp(cmd, "SSEQ", 4) == 0) {
return getseq();
buf = calloc(SS_BUFSIZE, sizeof(char));
getseq_r(buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -554,7 +603,11 @@ char *exe_cmd(char *in)
* 200:1,16;
*/
if (strncmp(cmd, "SEST", 4) == 0) {
return sem_status(token);
buf = calloc(SS_BUFSIZE, sizeof(char));
sem_status_r(token, buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -563,7 +616,11 @@ char *exe_cmd(char *in)
* 200:1,16;
*/
if (strncmp(cmd, "SECR", 4) == 0) {
return sem_create(token);
buf = calloc(SS_BUFSIZE, sizeof(char));
sem_create_r(token, buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}
/*
@ -572,7 +629,11 @@ char *exe_cmd(char *in)
* 200:1,16;
*/
if (strncmp(cmd, "SERM", 4) == 0) {
return sem_remove(token);
buf = calloc(SS_BUFSIZE, sizeof(char));
sem_remove_r(token, buf);
snprintf(obuf, SS_BUFSIZE, "%s", buf);
free(buf);
return obuf;
}

View File

@ -4,7 +4,7 @@
* Purpose ...............: Give status of all filesystems
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2006
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -236,11 +236,8 @@ void fill_mfslist(mfs_list **fap, char *mountpoint, char *fstype)
*/
char *disk_reset(void)
{
static char buf[10];
disk_reread = TRUE;
snprintf(buf, 10, "100:0;");
return buf;
return (char *)"100:0;";
}
@ -249,9 +246,8 @@ char *disk_reset(void)
* Check free diskspace on all by mbse used filesystems.
* The amount of needed space is given in MBytes.
*/
char *disk_check(char *token)
void disk_check_r(char *token, char *buf)
{
static char buf[SS_BUFSIZE];
mfs_list *tmp;
unsigned int needed, lowest = 0xffffffff;
int rc;
@ -264,7 +260,7 @@ char *disk_check(char *token)
* Answer Error
*/
snprintf(buf, SS_BUFSIZE, "100:1,3");
return buf;
return;
}
if ((rc = pthread_mutex_lock(&a_mutex)))
@ -283,7 +279,7 @@ char *disk_check(char *token)
} else {
snprintf(buf, SS_BUFSIZE, "100:2,1,%d;", lowest);
}
return buf;
return;
}
@ -292,9 +288,8 @@ char *disk_check(char *token)
* This function returns the information of all mounted filesystems,
* but no more then 10 filesystems.
*/
char *disk_getfs()
void disk_getfs_r(char *buf)
{
static char buf[SS_BUFSIZE];
char tt[80], *ans = NULL;
mfs_list *tmp;
int rc, i = 0;
@ -302,7 +297,7 @@ char *disk_getfs()
buf[0] = '\0';
if (mfs == NULL) {
snprintf(buf, SS_BUFSIZE, "100:0;");
return buf;
return;
}
if ((rc = pthread_mutex_lock(&a_mutex)))
@ -332,7 +327,7 @@ char *disk_getfs()
free(ans);
ans = NULL;
return buf;
return;
}

View File

@ -3,9 +3,9 @@
/* $Id$ */
char *disk_reset(void); /* Reset disk tables */
char *disk_check(char *); /* Check space in Megabytes */
char *disk_getfs(void); /* Get disk status */
void *disk_thread(void); /* Disk watch thread */
char *disk_reset(void); /* Reset disk tables */
void disk_check_r(char *, char *); /* Check space in Megabytes */
void disk_getfs_r(char *); /* Get disk status */
void *disk_thread(void); /* Disk watch thread */
#endif

View File

@ -4,7 +4,7 @@
* Purpose ...............: Give system information
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2006
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -37,10 +37,9 @@
/*
* Get BBS System info.
*/
char *get_sysinfo(void)
void get_sysinfo_r(char *buf)
{
FILE *fp;
static char buf[SS_BUFSIZE];
char *temp;
time_t startdate;
@ -50,51 +49,50 @@ char *get_sysinfo(void)
if ((fp = fopen(temp, "r")) == NULL) {
free(temp);
return buf;
return;
}
free(temp);
if (fread(&SYSINFO, sizeof(SYSINFO), 1, fp) == 1) {
startdate = SYSINFO.StartDate;
ctime_r(&startdate, temp);
snprintf(buf, SS_BUFSIZE, "100:7,%d,%d,%d,%d,%d,%s,%s;", SYSINFO.SystemCalls,
SYSINFO.Pots, SYSINFO.ISDN, SYSINFO.Network, SYSINFO.Local,
ctime(&startdate), clencode(SYSINFO.LastCaller));
temp, clencode(SYSINFO.LastCaller));
}
free(temp);
fclose(fp);
return buf;
return;
}
char *get_lastcallercount(void)
void get_lastcallercount_r(char *buf)
{
static char buf[41];
char *temp;
FILE *fp;
snprintf(buf, 41, "100:1,0;");
snprintf(buf, SS_BUFSIZE, "100:1,0;");
temp = calloc(PATH_MAX, sizeof(char));
snprintf(temp, PATH_MAX, "%s/etc/lastcall.data", getenv("MBSE_ROOT"));
if ((fp = fopen(temp, "r")) == NULL) {
free(temp);
return buf;
return;
}
fread(&LCALLhdr, sizeof(LCALLhdr), 1, fp);
fseek(fp, 0, SEEK_END);
snprintf(buf, 41, "100:1,%ld;", ((ftell(fp) - LCALLhdr.hdrsize) / LCALLhdr.recsize));
snprintf(buf, SS_BUFSIZE, "100:1,%ld;", ((ftell(fp) - LCALLhdr.hdrsize) / LCALLhdr.recsize));
fclose(fp);
free(temp);
return buf;
return;
}
char *get_lastcallerrec(int Rec)
void get_lastcallerrec_r(int Rec, char *buf)
{
static char buf[SS_BUFSIZE];
char *temp, action[9], *name, *city;
FILE *fp;
@ -103,7 +101,7 @@ char *get_lastcallerrec(int Rec)
snprintf(temp, PATH_MAX, "%s/etc/lastcall.data", getenv("MBSE_ROOT"));
if ((fp = fopen(temp, "r")) == NULL) {
free(temp);
return buf;
return;
}
fread(&LCALLhdr, sizeof(LCALLhdr), 1, fp);
fseek(fp, ((Rec -1) * LCALLhdr.recsize) + LCALLhdr.hdrsize, SEEK_SET);
@ -140,7 +138,7 @@ char *get_lastcallerrec(int Rec)
free(temp);
fclose(fp);
return buf;
return;
}

View File

@ -4,9 +4,9 @@
/* $Id$ */
char *get_sysinfo(void); /* Get System Info */
char *get_lastcallercount(void); /* Get Lastcallers count */
char *get_lastcallerrec(int); /* Get Lastcaller record */
void get_sysinfo_r(char *); /* Get System Info */
void get_lastcallercount_r(char *); /* Get Lastcallers count */
void get_lastcallerrec_r(int, char *); /* Get Lastcaller record */
#endif

View File

@ -4,7 +4,7 @@
* Purpose ...............: Buffers for registration information.
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2006
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -396,28 +396,26 @@ int reg_sysop(char *data)
/*
* Check for personal message
*/
char *reg_ipm(char *data)
void reg_ipm_r(char *data, char *buf)
{
char *cnt, *pid, *name, *msg;
static char buf[128];
int rec;
buf[0] = '\0';
snprintf(buf, 128, "100:0;");
snprintf(buf, SS_BUFSIZE, "100:0;");
cnt = strtok(data, ",");
pid = strtok(NULL, ";");
if ((rec = reg_find(pid)) == -1)
return buf;
return;
reginfo[rec].lastcon = (int)time(NULL);
if (!reginfo[rec].ismsg)
return buf;
return;
buf[0] = '\0';
name = xstrcpy(clencode(reginfo[rec].fname[reginfo[rec].ptr_out]));
msg = xstrcpy(clencode(reginfo[rec].msg[reginfo[rec].ptr_out]));
snprintf(buf, 128, "100:2,%s,%s;", name, msg);
snprintf(buf, SS_BUFSIZE, "100:2,%s,%s;", name, msg);
if (reginfo[rec].ptr_out < RB)
reginfo[rec].ptr_out++;
else
@ -429,7 +427,7 @@ char *reg_ipm(char *data)
free(name);
free(msg);
return buf;
return;
}
@ -506,13 +504,10 @@ int reg_spm(char *data)
char *reg_fre(void)
void reg_fre_r(char *buf)
{
static char buf[80];
int i, users = 0, utils = 0;
buf[0] = '\0';
for (i = 1; i < MAXCLIENT; i++) {
if (reginfo[i].pid) {
if ((!strncmp(reginfo[i].prg, "mbsebbs", 7)) ||
@ -538,7 +533,7 @@ char *reg_fre(void)
snprintf(buf, 80, "100:1,Running utilities: %02d Active users: %02d;", utils, users);
else
snprintf(buf, 80, "100:0;");
return buf;
return;
}
@ -548,13 +543,11 @@ char *reg_fre(void)
* must be 1, for the next searches 0. Returns 100:0; if there
* is an error or the end of file is reached.
*/
char *get_reginfo(int first)
void get_reginfo_r(int first, char *buf)
{
static char buf[256];
char *name, *prg, *city, *doing;
memset(&buf, 0, sizeof(buf));
snprintf(buf, 256, "100:0;");
snprintf(buf, SS_BUFSIZE, "100:0;");
/*
* Loop forever until an error occours, eof is reached or
@ -568,21 +561,21 @@ char *get_reginfo(int first)
entrypos++;
if (entrypos == MAXCLIENT)
return buf;
return;
if ((int)reginfo[entrypos].pid != 0) {
name = xstrcpy(clencode(reginfo[entrypos].uname));
prg = xstrcpy(clencode(reginfo[entrypos].prg));
city = xstrcpy(clencode(reginfo[entrypos].city));
doing = xstrcpy(clencode( reginfo[entrypos].doing));
snprintf(buf, 256, "100:7,%d,%s,%s,%s,%s,%s,%d;",
snprintf(buf, SS_BUFSIZE, "100:7,%d,%s,%s,%s,%s,%s,%d;",
reginfo[entrypos].pid, reginfo[entrypos].tty,
name, prg, city, doing, reginfo[entrypos].started);
free(name);
free(prg);
free(city);
free(doing);
return buf;
return;
}
}
/* never reached */
@ -665,24 +658,22 @@ int reg_cancel(char *data)
/*
* Check paging status for from mbmon
*/
char *reg_checkpage(char *data)
void reg_checkpage_r(char *data, char *buf)
{
static char buf[128];
int i;
memset(&buf, 0, sizeof(buf));
for (i = 1; i < MAXCLIENT; i++) {
if (reginfo[i].pid && reginfo[i].paging) {
snprintf(buf, 128, "100:3,%d,1,%s;", reginfo[i].pid, clencode(reginfo[i].reason));
return buf;
snprintf(buf, SS_BUFSIZE, "100:3,%d,1,%s;", reginfo[i].pid, clencode(reginfo[i].reason));
return;
}
if (reginfo[i].pid && reginfo[i].haspaged) {
snprintf(buf, 128, "100:3,%d,0,%s;", reginfo[i].pid, clencode(reginfo[i].reason));
return buf;
snprintf(buf, SS_BUFSIZE, "100:3,%d,0,%s;", reginfo[i].pid, clencode(reginfo[i].reason));
return;
}
}
snprintf(buf, 128, "100:0;");
return buf;
snprintf(buf, SS_BUFSIZE, "100:0;");
return;
}

View File

@ -45,17 +45,17 @@ int reg_nop(char *);
int reg_timer(int, char *);
int reg_tty(char *);
int reg_user(char *);
int reg_silent(char *); /* Set/Reset do not disturb */
char *reg_ipm(char *); /* Check for personal message */
int reg_spm(char *); /* Send personal message */
char *reg_fre(void); /* Check if system is free */
char *get_reginfo(int); /* Get registration info */
int reg_sysop(char *); /* Registrate sysop presence */
int reg_page(char *); /* Page sysop for chat */
int reg_cancel(char *); /* Cancel sysop page */
char *reg_checkpage(char *); /* Check paging status */
int reg_ispaging(char *); /* Check if user with pid paged */
void reg_sysoptalk(char *); /* Is now talking to the sysop */
int reg_silent(char *); /* Set/Reset do not disturb */
void reg_ipm_r(char *, char *); /* Check for personal message */
int reg_spm(char *); /* Send personal message */
void reg_fre_r(char *); /* Check if system is free */
void get_reginfo_r(int, char *); /* Get registration info */
int reg_sysop(char *); /* Registrate sysop presence */
int reg_page(char *); /* Page sysop for chat */
int reg_cancel(char *); /* Cancel sysop page */
void reg_checkpage_r(char *, char *); /* Check paging status */
int reg_ispaging(char *); /* Check if user with pid paged */
void reg_sysoptalk(char *); /* Is now talking to the sysop */
#endif

View File

@ -4,7 +4,7 @@
* Purpose ...............: Keep track of server status
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2006
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@ -151,19 +151,11 @@ void status_write(void)
struct tm ttm;
time_t temp;
#if defined(__OpenBSD)
temp = time(NULL);
localtime_r(&temp, &ttm);
yday = ttm.tm_yday;
temp = (time_t)status.daily;
localtime_r(&temp, &ttm);
#else
temp = time(NULL);
ttm = *localtime(&temp);
yday = ttm.tm_yday;
temp = (time_t)status.daily;
ttm = *localtime(&temp);
#endif
/*
* If we passed to the next day, zero the today counters
@ -219,11 +211,7 @@ int get_zmh()
time_t Now;
Now = time(NULL);
#if defined(__OpenBSD__)
gmtime_r(&Now, &l_date);
#else
l_date = *gmtime(&Now);
#endif
snprintf(sstime, 6, "%02d:%02d", l_date.tm_hour, l_date.tm_min);
if ((strncmp(sstime, TCFG.zmh_start, 5) >= 0) && (strncmp(sstime, TCFG.zmh_end, 5) < 0)) {
@ -303,23 +291,20 @@ void stat_inc_cerr()
char *stat_status()
void stat_status_r(char *buf)
{
static char buf[160];
int srvcnt = 0, chncnt = 0, usrcnt = 0;
srv_list *tmps;
chn_list *tmpc;
usr_list *tmpu;
buf[0] = '\0';
for (tmps = servers; tmps; tmps = tmps->next)
srvcnt++;
for (tmpc = channels; tmpc; tmpc = tmpc->next)
chncnt++;
for (tmpu = users; tmpu; tmpu = tmpu->next)
usrcnt++;
snprintf(buf, 160, "100:23,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%2.2f,%u,%d,%d,%d;",
snprintf(buf, SS_BUFSIZE, "100:23,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%2.2f,%u,%d,%d,%d;",
status.start, status.laststart, status.daily,
status.startups, status.clients,
status.total.tot_clt, status.total.peak_clt,
@ -328,7 +313,7 @@ char *stat_status()
status.today.s_error, status.today.c_error,
status.open, get_zmh(), internet, s_do_inet, Processing, Load, status.sequence,
srvcnt, chncnt, usrcnt);
return buf;
return;
}
@ -353,15 +338,12 @@ int stat_bbs_stat()
/*
* Get next sequence number
*/
char *getseq(void)
void getseq_r(char *buf)
{
static char buf[80];
buf[0] = '\0';
status.sequence++;
status_write();
snprintf(buf, 80, "100:1,%u;", status.sequence);
return buf;
return;
}
@ -406,13 +388,11 @@ int sem_set(char *sem, int value)
char *sem_status(char *data)
void sem_status_r(char *data, char *buf)
{
char *cnt, *sem;
static char buf[40];
int value;
buf[0] = '\0';
snprintf(buf, 40, "200:1,16;");
cnt = strtok(data, ",");
sem = strtok(NULL, ";");
@ -439,47 +419,45 @@ char *sem_status(char *data)
value = s_do_inet;
} else {
Syslog('s', "sem_status(%s) buf=%s", sem, buf);
return buf;
return;
}
snprintf(buf, 40, "100:1,%s;", value ? "1":"0");
return buf;
return;
}
char *sem_create(char *data)
void sem_create_r(char *data, char *buf)
{
static char buf[40];
char *cnt, *sem;
cnt = strtok(data, ",");
sem = strtok(NULL, ";");
buf[0] = '\0';
snprintf(buf, 40, "200:1,16;");
if (sem_set(sem, TRUE))
snprintf(buf, 40, "100:0;");
else
snprintf(buf, 40, "200:1,16;");
return buf;
return;
}
char *sem_remove(char *data)
void sem_remove_r(char *data, char *buf)
{
static char buf[40];
char *cnt, *sem;
cnt = strtok(data, ",");
sem = strtok(NULL, ";");
buf[0] = '\0';
snprintf(buf, 40, "200:1,16;");
if (sem_set(sem, FALSE))
snprintf(buf, 40, "100:0;");
else
snprintf(buf, 40, "200:1,16;");
return buf;
return;
}

View File

@ -8,21 +8,21 @@
#define TOSSWAIT_TIME 30
void status_init(void); /* Initialize status module */
void stat_inc_clients(void); /* Increase connected clients */
void stat_dec_clients(void); /* Decrease connected clients */
void stat_set_open(int); /* Set BBS open status */
void stat_inc_serr(void); /* Increase syntax error */
void stat_inc_cerr(void); /* Increase comms error */
char *stat_status(void); /* Return status record */
int stat_bbs_stat(void); /* Get BBS open status */
char *getseq(void); /* Get next sequence number */
unsigned int gettoken(void); /* Get next sequence number */
int get_zmh(void); /* Check Zone Mail Hour */
int sem_set(char *, int); /* Set/Reset semafore */
char *sem_status(char *); /* Get semafore status */
char *sem_create(char *); /* Create semafore */
char *sem_remove(char *); /* Remove semafore */
void status_init(void); /* Initialize status module */
void stat_inc_clients(void); /* Increase connected clients */
void stat_dec_clients(void); /* Decrease connected clients */
void stat_set_open(int); /* Set BBS open status */
void stat_inc_serr(void); /* Increase syntax error */
void stat_inc_cerr(void); /* Increase comms error */
void stat_status_r(char *); /* Return status record */
int stat_bbs_stat(void); /* Get BBS open status */
void getseq_r(char *); /* Get next sequence number */
unsigned int gettoken(void); /* Get next sequence number */
int get_zmh(void); /* Check Zone Mail Hour */
int sem_set(char *, int); /* Set/Reset semafore */
void sem_status_r(char *, char *); /* Get semafore status */
void sem_create_r(char *, char *); /* Create semafore */
void sem_remove_r(char *, char *); /* Remove semafore */
#endif

View File

@ -404,12 +404,14 @@ int file_size(char *path)
*/
time_t file_time(char *path)
{
static struct stat sb;
struct stat sb;
time_t thetime;
if (stat(path, &sb) == -1)
return -1;
return sb.st_mtime;
thetime = sb.st_mtime;
return thetime;
}
@ -419,8 +421,24 @@ time_t file_time(char *path)
*/
char *ascfnode(faddr *a, int fl)
{
static char buf[128];
static char buf[64];
buf[0] = '\0';
if ((fl & 0x08) && (a->zone))
snprintf(buf+strlen(buf), 10, "%u:",a->zone);
if (fl & 0x04)
snprintf(buf+strlen(buf), 10, "%u/",a->net);
if (fl & 0x02)
snprintf(buf+strlen(buf), 10, "%u",a->node);
if ((fl & 0x01) && (a->point))
snprintf(buf+strlen(buf), 10, ".%u",a->point);
if ((fl & 0x10) && (strlen(a->domain)))
snprintf(buf+strlen(buf), 14, "@%s",a->domain);
return buf;
}
void ascfnode_r(faddr *a, int fl, char *buf)
{
buf[0] = '\0';
if ((fl & 0x08) && (a->zone))
snprintf(buf+strlen(buf), 10, "%u:",a->zone);
@ -432,7 +450,7 @@ char *ascfnode(faddr *a, int fl)
snprintf(buf+strlen(buf), 10, ".%u",a->point);
if ((fl & 0x10) && (strlen(a->domain)))
snprintf(buf+strlen(buf), 14, "@%s",a->domain);
return buf;
return;
}
@ -440,10 +458,8 @@ char *ascfnode(faddr *a, int fl)
/*
* Return ASCII string for node, the bits in 'fl' set the output format.
*/
char *fido2str(fidoaddr a, int fl)
void fido2str_r(fidoaddr a, int fl, char *buf)
{
static char buf[128];
buf[0] = '\0';
if ((fl & 0x08) && (a.zone))
snprintf(buf+strlen(buf), 10, "%u:",a.zone);
@ -455,39 +471,36 @@ char *fido2str(fidoaddr a, int fl)
snprintf(buf+strlen(buf), 10, ".%u",a.point);
if ((fl & 0x10) && (strlen(a.domain)))
snprintf(buf+strlen(buf), 14, "@%s",a.domain);
return buf;
return;
}
char *Dos2Unix(char *dosname)
void Dos2Unix_r(char *dosname, char *buf2)
{
char buf[PATH_MAX];
static char buf2[PATH_MAX];
char *p, *q;
char buf[PATH_MAX];
char *p, *q;
memset(&buf, 0, sizeof(buf));
memset(&buf2, 0, sizeof(buf2));
snprintf(buf, PATH_MAX, "%s", dosname);
p = buf;
if (strlen(CFG.dospath)) {
if (strncasecmp(p, CFG.dospath, strlen(CFG.dospath)) == 0) {
strcpy((char *)buf2, CFG.uxpath);
for (p+=strlen(CFG.dospath), q = buf2 + strlen(buf2); *p; p++, q++)
*q = ((*p) == '\\')?'/':tolower(*p);
if (strncasecmp(p, CFG.dospath, strlen(CFG.dospath)) == 0) {
strcpy((char *)buf2, CFG.uxpath);
for (p+=strlen(CFG.dospath), q = buf2 + strlen(buf2); *p; p++, q++)
*q = ((*p) == '\\')?'/':tolower(*p);
*q = '\0';
p = buf2;
} else {
if (strncasecmp(p, CFG.uxpath, strlen(CFG.uxpath)) == 0) {
for (p+=strlen(CFG.uxpath), q = buf2 + strlen(buf2); *p; p++, q++)
*q = ((*p) == '\\')?'/':tolower(*p);
*q = '\0';
p = buf2;
}
}
p = buf2;
} else {
if (strncasecmp(p, CFG.uxpath, strlen(CFG.uxpath)) == 0) {
for (p+=strlen(CFG.uxpath), q = buf2 + strlen(buf2); *p; p++, q++)
*q = ((*p) == '\\')?'/':tolower(*p);
*q = '\0';
p = buf2;
}
}
}
return buf2;
return;
}
@ -499,17 +512,11 @@ char *dayname(void)
{
time_t tt;
struct tm ptm;
static char buf[3];
tt = time(NULL);
#if defined(__OpenBSD__)
localtime_r(&tt, &ptm);
#else
ptm = *localtime(&tt);
#endif
snprintf(buf, 3, "%s", dow[ptm.tm_wday]);
return buf;
return dow[ptm.tm_wday];
}

View File

@ -35,8 +35,9 @@ int mkdirs(char *, mode_t);
int file_size(char *);
time_t file_time(char *);
char *ascfnode(faddr *, int);
char *fido2str(fidoaddr, int);
char *Dos2Unix(char *);
void ascfnode_r(faddr *, int, char *);
void fido2str_r(fidoaddr, int, char *);
void Dos2Unix_r(char *, char *);
char *dayname(void);
void InitFidonet(void);
int SearchFidonet(unsigned short);