From 709a2ad3af3dc8613fc40065bb711a7188b3e4b0 Mon Sep 17 00:00:00 2001 From: Michiel Broek Date: Sun, 3 Aug 2003 14:08:07 +0000 Subject: [PATCH] Added and changed program locks --- ChangeLog | 8 ++ lib/Makefile | 4 +- lib/common.h | 7 ++ lib/proglock.c | 150 ++++++++++++++++++++++++++++++ mbfido/mbindex.c | 228 ++++++++++++++++------------------------------ mbmon/Makefile | 9 +- mbmon/mbmon.c | 23 +++-- mbmon/proglock.c | 143 +++++++++++++++++++++++++++++ mbmon/proglock.h | 9 ++ mbsetup/mbsetup.c | 153 ++++++++++++++++--------------- mbtask/mbtask.c | 145 ++++++++++++++++++----------- mbtask/mbtask.h | 4 - 12 files changed, 593 insertions(+), 290 deletions(-) create mode 100644 lib/proglock.c create mode 100644 mbmon/proglock.c create mode 100644 mbmon/proglock.h diff --git a/ChangeLog b/ChangeLog index d42823b5..9c623131 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,7 @@ v0.37.5 12-Jul-2003 common.a: Node locking tests for non-stale lockfiles older then 6 hours. + Added general code for prgram locking. mbcico: Implemented CRAM rev.4 change in binkp driver. @@ -24,9 +25,16 @@ v0.37.5 12-Jul-2003 mbsetup: Added menu entry 1.5.21 for setting maximum allowed logins. + Added program locking, only one mbsetup can run at the same + time. mbtask: On new installations sets max logins to 1. + Now uses standard locking in ~/var/run + + mbmon: + Added program locking, only one mbmon can run at the same time + to prevent troubles with chat and sysop available. lang: Added language prompts 18 and 19. diff --git a/lib/Makefile b/lib/Makefile index 723673c1..f181cb7b 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -8,12 +8,12 @@ CLCOMM_SRCS = clcomm.c client.c crc.c semafore.c signame.c CLCOMM_OBJS = clcomm.o client.o crc.o semafore.o signame.o CLCOMM_HDRS = clcomm.h COMMON_SRCS = attach.c falists.c hdr.c parsedate.c rfcmsg.c unpacker.c \ - batchrd.c ftn.c pktname.c mangle.c sectest.c \ + batchrd.c ftn.c pktname.c mangle.c sectest.c proglock.c \ dostran.c ftnmsg.c mbfile.c nodelock.c rawio.c strcasestr.c \ execute.c expipe.c getheader.c noderecord.c rfcaddr.c strutil.c \ faddr.c gmtoffset.c packet.c rfcdate.c term.c endian.c COMMON_OBJS = ftscprod.o attach.o falists.o hdr.o parsedate.o rfcmsg.o unpacker.o \ - batchrd.o ftn.o pktname.o mangle.o sectest.o \ + batchrd.o ftn.o pktname.o mangle.o sectest.o proglock.o \ dostran.o ftnmsg.o mbfile.o nodelock.o rawio.o strcasestr.o \ execute.o expipe.o getheader.o noderecord.o rfcaddr.o strutil.o \ faddr.o gmtoffset.o packet.o rfcdate.o term.o endian.o diff --git a/lib/common.h b/lib/common.h index 47a045ae..7edebf1e 100644 --- a/lib/common.h +++ b/lib/common.h @@ -508,5 +508,12 @@ void name_mangle(char *); /* Mangle name or make uppercase */ int Access(securityrec, securityrec); /* Check security access */ int Le_Access(securityrec, securityrec); /* Endian independant */ + +/* + * proglock.c + */ +int lockprogram(char *); /* Lock a program */ +void ulockprogram(char *); /* Unlock a program */ + #endif diff --git a/lib/proglock.c b/lib/proglock.c new file mode 100644 index 00000000..514cfd9e --- /dev/null +++ b/lib/proglock.c @@ -0,0 +1,150 @@ +/***************************************************************************** + * + * $Id$ + * Purpose ...............: Program Locking + * + ***************************************************************************** + * Copyright (C) 1997-2003 + * + * Michiel Broek FIDO: 2:280/2802 + * Beekmansbos 10 + * 1971 BV IJmuiden + * the Netherlands + * + * This file is part of MBSE BBS. + * + * This BBS is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * MBSE BBS is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MBSE BBS; see the file COPYING. If not, write to the Free + * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + *****************************************************************************/ + +#include "../config.h" +#include "../lib/libs.h" +//#include "../lib/memwatch.h" +#include "../lib/structs.h" +#include "../lib/users.h" +#include "../lib/records.h" +#include "../lib/common.h" +#include "../lib/clcomm.h" +//#include "../lib/dbcfg.h" +//#include "../lib/dbftn.h" +//#include "../lib/mberrors.h" + + +extern int do_quiet; /* Quiet flag */ + + +/* + * Put a lock on a program. + */ +int lockprogram(char *progname) +{ + char *tempfile, *lockfile; + FILE *fp; + pid_t oldpid; + + tempfile = calloc(PATH_MAX, sizeof(char)); + lockfile = calloc(PATH_MAX, sizeof(char)); + + sprintf(tempfile, "%s/var/run/%s.tmp", getenv("MBSE_ROOT"), progname); + sprintf(lockfile, "%s/var/run/%s", getenv("MBSE_ROOT"), progname); + + if ((fp = fopen(tempfile, "w")) == NULL) { + WriteError("$Can't create lockfile \"%s\"", tempfile); + free(tempfile); + free(lockfile); + return 1; + } + fprintf(fp, "%10u\n", getpid()); + fclose(fp); + + while (TRUE) { + if (link(tempfile, lockfile) == 0) { + unlink(tempfile); + free(tempfile); + free(lockfile); + return 0; + } + if ((fp = fopen(lockfile, "r")) == NULL) { + WriteError("$Can't open lockfile \"%s\"", lockfile); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + if (fscanf(fp, "%u", &oldpid) != 1) { + WriteError("$Can't read old pid from \"%s\"", tempfile); + fclose(fp); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + fclose(fp); + if (kill(oldpid,0) == -1) { + if (errno == ESRCH) { + Syslog('+', "Stale lock found for pid %u", oldpid); + unlink(lockfile); + /* no return, try lock again */ + } else { + WriteError("$Kill for %u failed", oldpid); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + } else { + Syslog('+', "%s already running, pid=%u", progname, oldpid); + if (!do_quiet) + printf("Another %s is already running.\n", progname); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + } +} + + + +void ulockprogram(char *progname) +{ + char *lockfile; + FILE *fp; + pid_t oldpid; + + lockfile = calloc(PATH_MAX, sizeof(char)); + sprintf(lockfile, "%s/var/run/%s", getenv("MBSE_ROOT"), progname); + + if ((fp = fopen(lockfile, "r")) == NULL) { + WriteError("$Can't open lockfile \"%s\"", lockfile); + free(lockfile); + return; + } + if (fscanf(fp, "%u", &oldpid) != 1) { + WriteError("$Can't read old pid from \"%s\"", lockfile); + fclose(fp); + unlink(lockfile); + free(lockfile); + return; + } + + if (oldpid == getpid()) { + (void)unlink(lockfile); + } else { + WriteError("Lockfile owned by pid %d, not removed", oldpid); + } + + free(lockfile); +} + diff --git a/mbfido/mbindex.c b/mbfido/mbindex.c index 1a8ca425..7bd2a9ee 100644 --- a/mbfido/mbindex.c +++ b/mbfido/mbindex.c @@ -4,7 +4,7 @@ * Purpose ...............: Nodelist Compiler * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -41,10 +41,6 @@ #include "../lib/mberrors.h" -#define TMPNAME "TMP." -#define LCKNAME "LOCKFILE" - - typedef struct _nl_list { struct _nl_list *next; struct _nlidx idx; @@ -59,7 +55,6 @@ long total = 0, entries = 0; int filenr = 0; unsigned short regio; nl_list *nll = NULL; -static char lockfile[81]; extern int do_quiet; /* Quiet flag */ @@ -68,73 +63,6 @@ time_t t_start; /* Start time */ time_t t_end; /* End time */ -/* - * Put a lock on this program. - */ -int lockindex(void) -{ - char Tmpfile[81]; - FILE *fp; - pid_t oldpid; - - sprintf(Tmpfile, "%s/", CFG.nodelists); - strcpy(lockfile, Tmpfile); - sprintf(Tmpfile + strlen(Tmpfile), "%s%u", TMPNAME, getpid()); - sprintf(lockfile + strlen(lockfile), "%s", LCKNAME); - - if ((fp = fopen(Tmpfile, "w")) == NULL) { - WriteError("$Can't create lockfile \"%s\"", Tmpfile); - return 1; - } - fprintf(fp, "%10u\n", getpid()); - fclose(fp); - - while (TRUE) { - if (link(Tmpfile, lockfile) == 0) { - unlink(Tmpfile); - return 0; - } - if ((fp = fopen(lockfile, "r")) == NULL) { - WriteError("$Can't open lockfile \"%s\"", Tmpfile); - unlink(Tmpfile); - return 1; - } - if (fscanf(fp, "%u", &oldpid) != 1) { - WriteError("$Can't read old pid from \"%s\"", Tmpfile); - fclose(fp); - unlink(Tmpfile); - return 1; - } - fclose(fp); - if (kill(oldpid,0) == -1) { - if (errno == ESRCH) { - Syslog('+', "Stale lock found for pid %u", oldpid); - unlink(lockfile); - /* no return, try lock again */ - } else { - WriteError("$Kill for %u failed",oldpid); - unlink(Tmpfile); - return 1; - } - } else { - Syslog('+', "mbindex already running, pid=%u", oldpid); - if (!do_quiet) - printf("Another mbindex is already running.\n"); - unlink(Tmpfile); - return 1; - } - } -} - - - -void ulockindex(void) -{ - if (lockfile) - (void)unlink(lockfile); -} - - /* * If we don't know what to type @@ -176,102 +104,102 @@ void ProgName(void) void die(int onsig) { - if (onsig && (onsig < NSIG)) - signal(onsig, SIG_IGN); + if (onsig && (onsig < NSIG)) + signal(onsig, SIG_IGN); - ulockindex(); + ulockprogram((char *)"mbindex"); - if (!do_quiet) { - colour(3, 0); - show_log = TRUE; - } + if (!do_quiet) { + colour(3, 0); + show_log = TRUE; + } - if (IsSema((char *)"mbindex")) - RemoveSema((char *)"mbindex"); + if (IsSema((char *)"mbindex")) + RemoveSema((char *)"mbindex"); - if (onsig) { - if (onsig <= NSIG) - WriteError("Terminated on signal %d (%s)", onsig, SigName[onsig]); - else - WriteError("Terminated with error %d", onsig); - } + if (onsig) { + if (onsig <= NSIG) + WriteError("Terminated on signal %d (%s)", onsig, SigName[onsig]); + else + WriteError("Terminated with error %d", onsig); + } - t_end = time(NULL); - Syslog(' ', "MBINDEX finished in %s", t_elapsed(t_start, t_end)); + t_end = time(NULL); + Syslog(' ', "MBINDEX finished in %s", t_elapsed(t_start, t_end)); - if (!do_quiet) - colour(7, 0); + if (!do_quiet) + colour(7, 0); - ExitClient(onsig); + ExitClient(onsig); } int main(int argc,char *argv[]) { - int i; - char *cmd; - struct passwd *pw; + int i; + char *cmd; + struct passwd *pw; #ifdef MEMWATCH - mwInit(); + mwInit(); #endif - InitConfig(); - InitFidonet(); - TermInit(1); - t_start = time(NULL); - umask(002); + InitConfig(); + InitFidonet(); + TermInit(1); + t_start = time(NULL); + umask(002); - /* - * Catch all the signals we can, and ignore the rest. - * Don't listen to SIGTERM. - */ - for(i = 0; i < NSIG; i++) { + /* + * Catch all the signals we can, and ignore the rest. + * Don't listen to SIGTERM. + */ + for (i = 0; i < NSIG; i++) { - if ((i == SIGHUP) || (i == SIGINT) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV)) - signal(i, (void (*))die); - else - signal(i, SIG_IGN); - } - - cmd = xstrcpy((char *)"Command line: mbindex"); - - if (argc > 2) - Help(); - - if (argc == 2) { - cmd = xstrcat(cmd, (char *)" "); - cmd = xstrcat(cmd, argv[1]); - - if (strncasecmp(argv[1], "-q", 2) == 0) - do_quiet = TRUE; - else - Help(); - } - - ProgName(); - pw = getpwuid(getuid()); - InitClient(pw->pw_name, (char *)"mbindex", CFG.location, CFG.logfile, CFG.util_loglevel, CFG.error_log, CFG.mgrlog); - - Syslog(' ', " "); - Syslog(' ', "MBINDEX v%s", VERSION); - Syslog(' ', cmd); - free(cmd); - - if (!diskfree(CFG.freespace)) - die(MBERR_DISK_FULL); - - if (lockindex()) { - if (!do_quiet) - printf("Can't lock mbindex, abort.\n"); - die(MBERR_NO_PROGLOCK); - } - - if (nodebld()) - die(MBERR_GENERAL); + if ((i == SIGHUP) || (i == SIGINT) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV)) + signal(i, (void (*))die); else - die(MBERR_OK); - return 0; + signal(i, SIG_IGN); + } + + cmd = xstrcpy((char *)"Command line: mbindex"); + + if (argc > 2) + Help(); + + if (argc == 2) { + cmd = xstrcat(cmd, (char *)" "); + cmd = xstrcat(cmd, argv[1]); + + if (strncasecmp(argv[1], "-q", 2) == 0) + do_quiet = TRUE; + else + Help(); + } + + ProgName(); + pw = getpwuid(getuid()); + InitClient(pw->pw_name, (char *)"mbindex", CFG.location, CFG.logfile, CFG.util_loglevel, CFG.error_log, CFG.mgrlog); + + Syslog(' ', " "); + Syslog(' ', "MBINDEX v%s", VERSION); + Syslog(' ', cmd); + free(cmd); + + if (!diskfree(CFG.freespace)) + die(MBERR_DISK_FULL); + + if (lockprogram((char *)"mbindex")) { + if (!do_quiet) + printf("Can't lock mbindex, abort.\n"); + die(MBERR_NO_PROGLOCK); + } + + if (nodebld()) + die(MBERR_GENERAL); + else + die(MBERR_OK); + return 0; } diff --git a/mbmon/Makefile b/mbmon/Makefile index 348bf7c8..b2a68a27 100644 --- a/mbmon/Makefile +++ b/mbmon/Makefile @@ -4,9 +4,9 @@ include ../Makefile.global -SRCS = mutil.c mbmon.c common.c -HDRS = mutil.h mbmon.h common.h -OBJS = mutil.o mbmon.o common.o +SRCS = mutil.c mbmon.c common.c proglock.c +HDRS = mutil.h mbmon.h common.h proglock.h +OBJS = mutil.o mbmon.o common.o proglock.o LIBS += ../lib/libmemwatch.a OTHER = Makefile @@ -58,6 +58,7 @@ depend: # DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT # Dependencies generated by make depend mutil.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h mutil.h -mbmon.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h mutil.h +mbmon.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h proglock.h mutil.h common.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h common.h +proglock.o: ../config.h ../lib/libs.h ../lib/memwatch.h ../lib/mberrors.h ../lib/structs.h common.h proglock.h # End of generated dependencies diff --git a/mbmon/mbmon.c b/mbmon/mbmon.c index 27b9ce75..375e95b1 100644 --- a/mbmon/mbmon.c +++ b/mbmon/mbmon.c @@ -5,7 +5,7 @@ * Todo ..................: Chat with user via server * ***************************************************************************** - * Copyright (C) 1997-2002 + * Copyright (C) 1997-2003 * * Michiel Broek FIDO: 2:280/2802 * Beekmansbos 10 @@ -35,6 +35,7 @@ #include "../lib/mberrors.h" #include "../lib/structs.h" #include "common.h" +#include "proglock.h" #include "mutil.h" @@ -58,15 +59,22 @@ static void die(int onsig) char buf[128]; signal(onsig, SIG_IGN); - screen_stop(); + + /* + * Prevent clear screen when the program was locked + */ + if (onsig != MBERR_NO_PROGLOCK) + screen_stop(); + if (onsig && (onsig <= NSIG)) - Syslog('?', "Finished on signal %s", SigName[onsig]); + Syslog('?', "MBMON Finished on signal %s", SigName[onsig]); else - Syslog(' ', "Normally finished"); + Syslog(' ', "MBMON Normally finished"); sprintf(buf, "CSYS:2,%d,0;", mypid); if (socket_send(buf) == 0) sprintf(buf, "%s", socket_receive()); + ulockprogram((char *)"mbmon"); ExitClient(0); } @@ -709,7 +717,7 @@ int main(int argc, char *argv[]) */ pw = getpwuid(getuid()); InitClient(pw->pw_name); - Syslog(' ', "Started by %s", pw->pw_name); + Syslog(' ', "MBMON Started by %s", pw->pw_name); bbs_free = FALSE; /* @@ -730,7 +738,6 @@ int main(int argc, char *argv[]) signal(SIGTERM,(void (*))die); signal(SIGKILL,(void (*))die); - /* * Find out if the environment variables LINES and COLUMNS are present, * if so, then use these for screen dimensions. @@ -747,6 +754,10 @@ int main(int argc, char *argv[]) } Syslog('-', "Screen size set to %dx%d", columns, lines); + if (lockprogram((char *)"mbmon")) { + printf("\n\7Another mbmon is already running, abort.\n\n"); + die(MBERR_NO_PROGLOCK); + } screen_start((char *)"MBmon"); diff --git a/mbmon/proglock.c b/mbmon/proglock.c new file mode 100644 index 00000000..b848d150 --- /dev/null +++ b/mbmon/proglock.c @@ -0,0 +1,143 @@ +/***************************************************************************** + * + * $Id$ + * Purpose ...............: Program Locking + * + ***************************************************************************** + * Copyright (C) 1997-2003 + * + * Michiel Broek FIDO: 2:280/2802 + * Beekmansbos 10 + * 1971 BV IJmuiden + * the Netherlands + * + * This file is part of MBSE BBS. + * + * This BBS is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2, or (at your option) any + * later version. + * + * MBSE BBS is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with MBSE BBS; see the file COPYING. If not, write to the Free + * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + *****************************************************************************/ + +#include "../config.h" +#include "../lib/libs.h" +#include "../lib/memwatch.h" +#include "../lib/mberrors.h" +#include "../lib/structs.h" +#include "common.h" +#include "proglock.h" + + + + +/* + * Put a lock on a program. + */ +int lockprogram(char *progname) +{ + char *tempfile, *lockfile; + FILE *fp; + pid_t oldpid; + + tempfile = calloc(PATH_MAX, sizeof(char)); + lockfile = calloc(PATH_MAX, sizeof(char)); + + sprintf(tempfile, "%s/var/run/%s.tmp", getenv("MBSE_ROOT"), progname); + sprintf(lockfile, "%s/var/run/%s", getenv("MBSE_ROOT"), progname); + + if ((fp = fopen(tempfile, "w")) == NULL) { + Syslog('?', "$Can't create lockfile \"%s\"", tempfile); + free(tempfile); + free(lockfile); + return 1; + } + fprintf(fp, "%10u\n", getpid()); + fclose(fp); + + while (TRUE) { + if (link(tempfile, lockfile) == 0) { + unlink(tempfile); + free(tempfile); + free(lockfile); + return 0; + } + if ((fp = fopen(lockfile, "r")) == NULL) { + Syslog('?', "$Can't open lockfile \"%s\"", lockfile); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + if (fscanf(fp, "%u", &oldpid) != 1) { + Syslog('?', "$Can't read old pid from \"%s\"", tempfile); + fclose(fp); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + fclose(fp); + if (kill(oldpid,0) == -1) { + if (errno == ESRCH) { + Syslog('+', "Stale lock found for pid %u", oldpid); + unlink(lockfile); + /* no return, try lock again */ + } else { + Syslog('?', "$Kill for %u failed", oldpid); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + } else { + Syslog('+', "%s already running, pid=%u", progname, oldpid); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + } +} + + + +void ulockprogram(char *progname) +{ + char *lockfile; + pid_t oldpid; + FILE *fp; + + lockfile = calloc(PATH_MAX, sizeof(char)); + sprintf(lockfile, "%s/var/run/%s", getenv("MBSE_ROOT"), progname); + + if ((fp = fopen(lockfile, "r")) == NULL) { + Syslog('?', "$Can't open lockfile \"%s\"", lockfile); + free(lockfile); + return; + } + if (fscanf(fp, "%u", &oldpid) != 1) { + Syslog('?', "$Can't read old pid from \"%s\"", lockfile); + fclose(fp); + unlink(lockfile); + free(lockfile); + return; + } + + if (oldpid == getpid()) { + (void)unlink(lockfile); + } else { + Syslog('?', "Lockfile owned by pid %d, not removed", oldpid); + } + + free(lockfile); +} + diff --git a/mbmon/proglock.h b/mbmon/proglock.h new file mode 100644 index 00000000..07f69f81 --- /dev/null +++ b/mbmon/proglock.h @@ -0,0 +1,9 @@ +#ifndef _PROGLOCK_H +#define _PROGLOCK_H + +/* $Id$ */ + +int lockprogram(char *); +void ulockprogram(char*); + +#endif diff --git a/mbsetup/mbsetup.c b/mbsetup/mbsetup.c index 5dd61bc2..de7a8fc3 100644 --- a/mbsetup/mbsetup.c +++ b/mbsetup/mbsetup.c @@ -88,7 +88,7 @@ static void die(int onsig) int i; signal(onsig, SIG_IGN); - if (!init) + if ((!init) && (onsig != MBERR_NO_PROGLOCK)) screen_stop(); if (exp_golded && (config_read() != -1)) { @@ -143,6 +143,7 @@ static void die(int onsig) free(temp); } + ulockprogram((char *)"mbsetup"); umask(oldmask); if (onsig && (onsig <= NSIG)) WriteError("MBSETUP finished on signal %s", SigName[onsig]); @@ -403,84 +404,90 @@ void initdatabases(void) int main(int argc, char *argv[]) { - int loop = 1; - struct passwd *pw; + int loop = 1; + struct passwd *pw; - /* - * Find out who is on the keyboard or automated the keyboard. - */ - pw = getpwuid(geteuid()); - if (strcmp(pw->pw_name, (char *)"mbse")) { - printf("ERROR: only user \"mbse\" may use this program\n"); - exit(MBERR_INIT_ERROR); - } + /* + * Find out who is on the keyboard or automated the keyboard. + */ + pw = getpwuid(geteuid()); + if (strcmp(pw->pw_name, (char *)"mbse")) { + printf("ERROR: only user \"mbse\" may use this program\n"); + exit(MBERR_INIT_ERROR); + } #ifdef MEMWATCH - mwInit(); + mwInit(); #endif - /* - * Read the global configuration data, registrate connection - */ - config_check(getenv("MBSE_ROOT")); - config_read(); - InitClient(pw->pw_name, (char *)"mbsetup", CFG.location, CFG.logfile, 0x1f, CFG.error_log, CFG.mgrlog); + /* + * Read the global configuration data, registrate connection + */ + config_check(getenv("MBSE_ROOT")); + config_read(); + InitClient(pw->pw_name, (char *)"mbsetup", CFG.location, CFG.logfile, 0x1f, CFG.error_log, CFG.mgrlog); - /* - * Setup several signals so when the program terminate's it - * will properly close the curses screens. - */ - signal(SIGINT, (void (*))die); - signal(SIGBUS, (void (*))die); - signal(SIGSEGV,(void (*))die); - signal(SIGTERM,(void (*))die); - signal(SIGKILL,(void (*))die); + /* + * Setup several signals so when the program terminate's it + * will properly close the curses screens. + */ + signal(SIGINT, (void (*))die); + signal(SIGBUS, (void (*))die); + signal(SIGSEGV,(void (*))die); + signal(SIGTERM,(void (*))die); + signal(SIGKILL,(void (*))die); - oldmask = umask(002); + oldmask = umask(002); - if ((argc == 2) && (strncmp(tl(argv[1]), "i", 1) == 0)) - init = TRUE; - else - screen_start((char *)"MBsetup"); + if ((argc == 2) && (strncmp(tl(argv[1]), "i", 1) == 0)) + init = TRUE; + else + screen_start((char *)"MBsetup"); - do_quiet = TRUE; - Syslog(' ', " "); - Syslog(' ', "MBSETUP v%s started by %s", VERSION, pw->pw_name); - if (init) - Syslog('+', "Cmd: mbsetup init"); - bbs_free = FALSE; - initdatabases(); + do_quiet = TRUE; + Syslog(' ', " "); + Syslog(' ', "MBSETUP v%s started by %s", VERSION, pw->pw_name); + if (init) + Syslog('+', "Cmd: mbsetup init"); + + if (lockprogram((char *)"mbsetup")) { + printf("\n\7Another mbsetup is already running, abort.\n\n"); + die(MBERR_NO_PROGLOCK); + } + + bbs_free = FALSE; + initdatabases(); - if (!init) { - do { - IsDoing("Browsing Menu"); - clr_index(); - set_color(WHITE, BLACK); - mvprintw( 5, 6, "0. MAIN SETUP"); - set_color(CYAN, BLACK); - mvprintw( 7, 6, "1. Edit Global configuration"); - mvprintw( 8, 6, "2. Edit Fido Networks"); - mvprintw( 9, 6, "3. Edit Archiver Programs"); - mvprintw(10, 6, "4. Edit Virus Scanners"); - mvprintw(11, 6, "5. Edit Modem types"); - mvprintw(12, 6, "6. Edit TTY lines info"); - mvprintw(13, 6, "7. Edit Fidonet Nodes"); - mvprintw(14, 6, "8. Edit BBS Setup"); - mvprintw(15, 6, "9. Edit Mail Setup"); - mvprintw(16, 6, "10. Edit File Echo's setup"); - mvprintw(17, 6, "11. Edit Newfiles Groups"); - mvprintw( 7,46, "12. Edit Newfiles Reports"); - mvprintw( 8,46, "13. Edit FileFind Setup"); - mvprintw( 9,46, "14. Edit Files Database"); - mvprintw(10,46, "15. Edit BBS Users"); - mvprintw(11,46, "16. Edit Services"); - mvprintw(12,46, "17. Edit Domains"); - mvprintw(13,46, "18. Edit Task Manager"); - mvprintw(14,46, "19. Edit Routing Table"); - mvprintw(15,46, "20. Show software information"); - mvprintw(16,46, "21. Create site documents"); + if (!init) { + do { + IsDoing("Browsing Menu"); + clr_index(); + set_color(WHITE, BLACK); + mvprintw( 5, 6, "0. MAIN SETUP"); + set_color(CYAN, BLACK); + mvprintw( 7, 6, "1. Edit Global configuration"); + mvprintw( 8, 6, "2. Edit Fido Networks"); + mvprintw( 9, 6, "3. Edit Archiver Programs"); + mvprintw(10, 6, "4. Edit Virus Scanners"); + mvprintw(11, 6, "5. Edit Modem types"); + mvprintw(12, 6, "6. Edit TTY lines info"); + mvprintw(13, 6, "7. Edit Fidonet Nodes"); + mvprintw(14, 6, "8. Edit BBS Setup"); + mvprintw(15, 6, "9. Edit Mail Setup"); + mvprintw(16, 6, "10. Edit File Echo's setup"); + mvprintw(17, 6, "11. Edit Newfiles Groups"); + mvprintw( 7,46, "12. Edit Newfiles Reports"); + mvprintw( 8,46, "13. Edit FileFind Setup"); + mvprintw( 9,46, "14. Edit Files Database"); + mvprintw(10,46, "15. Edit BBS Users"); + mvprintw(11,46, "16. Edit Services"); + mvprintw(12,46, "17. Edit Domains"); + mvprintw(13,46, "18. Edit Task Manager"); + mvprintw(14,46, "19. Edit Routing Table"); + mvprintw(15,46, "20. Show software information"); + mvprintw(16,46, "21. Create site documents"); - switch(select_menu(21)) { + switch(select_menu(21)) { case 0: loop = 0; break; @@ -547,11 +554,11 @@ int main(int argc, char *argv[]) case 21: site_docs(); break; - } - } while (loop == 1); - } + } + } while (loop == 1); + } - die(MBERR_OK); - return 0; + die(MBERR_OK); + return 0; } diff --git a/mbtask/mbtask.c b/mbtask/mbtask.c index aa1d1004..f6139ed9 100644 --- a/mbtask/mbtask.c +++ b/mbtask/mbtask.c @@ -56,7 +56,6 @@ static onetask task[MAXTASKS]; /* Array with tasks */ extern tocall calllist[MAXTASKS]; /* Array with calllist */ reg_info reginfo[MAXCLIENT]; /* Array with clients */ static pid_t pgrp; /* Pids group */ -static char lockfile[PATH_MAX]; /* Lockfile */ int sock = -1; /* Datagram socket */ struct sockaddr_un servaddr; /* Server address */ struct sockaddr_un from; /* From address */ @@ -693,67 +692,107 @@ void die(int onsig) */ int locktask(char *root) { - char Tmpfile[81]; - FILE *fp; - pid_t oldpid; + char *tempfile, *lockfile; + FILE *fp; + pid_t oldpid; - sprintf(Tmpfile, "%s/var/", root); - strcpy(lockfile, Tmpfile); - sprintf(Tmpfile + strlen(Tmpfile), "%s%u", TMPNAME, getpid()); - sprintf(lockfile + strlen(lockfile), "%s", LCKNAME); + tempfile = calloc(PATH_MAX, sizeof(char)); + lockfile = calloc(PATH_MAX, sizeof(char)); - if ((fp = fopen(Tmpfile, "w")) == NULL) { - perror("mbtask"); - printf("Can't create lockfile \"%s\"\n", Tmpfile); - return 1; + sprintf(tempfile, "%s/var/run/mbtask.tmp", root); + sprintf(lockfile, "%s/var/run/mbtask", root); + + if ((fp = fopen(tempfile, "w")) == NULL) { + perror("mbtask"); + printf("Can't create lockfile \"%s\"\n", tempfile); + free(tempfile); + free(lockfile); + return 1; + } + fprintf(fp, "%10u\n", getpid()); + fclose(fp); + + while (TRUE) { + if (link(tempfile, lockfile) == 0) { + unlink(tempfile); + free(tempfile); + free(lockfile); + return 0; + } + if ((fp = fopen(lockfile, "r")) == NULL) { + perror("mbtask"); + printf("Can't open lockfile \"%s\"\n", tempfile); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + if (fscanf(fp, "%u", &oldpid) != 1) { + perror("mbtask"); + printf("Can't read old pid from \"%s\"\n", tempfile); + fclose(fp); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; } - fprintf(fp, "%10u\n", getpid()); fclose(fp); - - while (TRUE) { - if (link(Tmpfile, lockfile) == 0) { - unlink(Tmpfile); - return 0; - } - if ((fp = fopen(lockfile, "r")) == NULL) { - perror("mbtask"); - printf("Can't open lockfile \"%s\"\n", Tmpfile); - unlink(Tmpfile); - return 1; - } - if (fscanf(fp, "%u", &oldpid) != 1) { - perror("mbtask"); - printf("Can't read old pid from \"%s\"\n", Tmpfile); - fclose(fp); - unlink(Tmpfile); - return 1; - } - fclose(fp); - if (kill(oldpid,0) == -1) { - if (errno == ESRCH) { - printf("Stale lock found for pid %u\n", oldpid); - unlink(lockfile); - /* no return, try lock again */ - } else { - perror("mbtask"); - printf("Kill for %u failed\n",oldpid); - unlink(Tmpfile); - return 1; - } - } else { - printf("Another mbtask is already running, pid=%u\n", oldpid); - unlink(Tmpfile); - return 1; - } + if (kill(oldpid,0) == -1) { + if (errno == ESRCH) { + printf("Stale lock found for pid %u\n", oldpid); + unlink(lockfile); + /* no return, try lock again */ + } else { + perror("mbtask"); + printf("Kill for %u failed\n",oldpid); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; + } + } else { + printf("Another mbtask is already running, pid=%u\n", oldpid); + unlink(tempfile); + free(tempfile); + free(lockfile); + return 1; } + } } void ulocktask(void) { - if (lockfile) - (void)unlink(lockfile); + char *lockfile; + pid_t oldpid; + FILE *fp; + struct passwd *pw; + + pw = getpwnam((char *)"mbse"); + lockfile = calloc(PATH_MAX, sizeof(char)); + sprintf(lockfile, "%s/var/run/mbtask", pw->pw_dir); + + if ((fp = fopen(lockfile, "r")) == NULL) { + WriteError("$Can't open lockfile \"%s\"", lockfile); + free(lockfile); + return; + } + if (fscanf(fp, "%u", &oldpid) != 1) { + WriteError("$Can't read old pid from \"%s\"", lockfile); + fclose(fp); + unlink(lockfile); + free(lockfile); + return; + } + + if (oldpid == getpid()) { + (void)unlink(lockfile); + } else { + WriteError("Lockfile owned by pid %d, not removed", oldpid); + } + + free(lockfile); } @@ -1245,6 +1284,7 @@ void scheduler(void) int main(int argc, char **argv) { struct passwd *pw; + char *lockfile; int i; pid_t frk; FILE *fp; @@ -1365,10 +1405,13 @@ int main(int argc, char **argv) * run the deamon process. Put the child's pid * in the lockfile before leaving. */ + lockfile = calloc(PATH_MAX, sizeof(char)); + sprintf(lockfile, "%s/var/run/mbtask", pw->pw_dir); if ((fp = fopen(lockfile, "w"))) { fprintf(fp, "%10u\n", frk); fclose(fp); } + free(lockfile); Syslog('+', "Starting daemon with pid %d", frk); exit(MBERR_OK); } diff --git a/mbtask/mbtask.h b/mbtask/mbtask.h index 4b63a0ca..4316231a 100644 --- a/mbtask/mbtask.h +++ b/mbtask/mbtask.h @@ -10,8 +10,6 @@ */ #define MAXTASKS 10 #define SLOWRUN 20 -#define TMPNAME "TMP." -#define LCKNAME "LOCKTASK" @@ -53,6 +51,4 @@ void scheduler(void); int locktask(char *); void ulocktask(void); - #endif -