Added and changed program locks

This commit is contained in:
Michiel Broek 2003-08-03 14:08:07 +00:00
parent 76e3607343
commit 709a2ad3af
12 changed files with 593 additions and 290 deletions

View File

@ -12,6 +12,7 @@ v0.37.5 12-Jul-2003
common.a: common.a:
Node locking tests for non-stale lockfiles older then 6 hours. Node locking tests for non-stale lockfiles older then 6 hours.
Added general code for prgram locking.
mbcico: mbcico:
Implemented CRAM rev.4 change in binkp driver. Implemented CRAM rev.4 change in binkp driver.
@ -24,9 +25,16 @@ v0.37.5 12-Jul-2003
mbsetup: mbsetup:
Added menu entry 1.5.21 for setting maximum allowed logins. Added menu entry 1.5.21 for setting maximum allowed logins.
Added program locking, only one mbsetup can run at the same
time.
mbtask: mbtask:
On new installations sets max logins to 1. 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: lang:
Added language prompts 18 and 19. Added language prompts 18 and 19.

View File

@ -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_OBJS = clcomm.o client.o crc.o semafore.o signame.o
CLCOMM_HDRS = clcomm.h CLCOMM_HDRS = clcomm.h
COMMON_SRCS = attach.c falists.c hdr.c parsedate.c rfcmsg.c unpacker.c \ 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 \ dostran.c ftnmsg.c mbfile.c nodelock.c rawio.c strcasestr.c \
execute.c expipe.c getheader.c noderecord.c rfcaddr.c strutil.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 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 \ 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 \ dostran.o ftnmsg.o mbfile.o nodelock.o rawio.o strcasestr.o \
execute.o expipe.o getheader.o noderecord.o rfcaddr.o strutil.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 faddr.o gmtoffset.o packet.o rfcdate.o term.o endian.o

View File

@ -508,5 +508,12 @@ void name_mangle(char *); /* Mangle name or make uppercase */
int Access(securityrec, securityrec); /* Check security access */ int Access(securityrec, securityrec); /* Check security access */
int Le_Access(securityrec, securityrec); /* Endian independant */ int Le_Access(securityrec, securityrec); /* Endian independant */
/*
* proglock.c
*/
int lockprogram(char *); /* Lock a program */
void ulockprogram(char *); /* Unlock a program */
#endif #endif

150
lib/proglock.c Normal file
View File

@ -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);
}

View File

@ -4,7 +4,7 @@
* Purpose ...............: Nodelist Compiler * Purpose ...............: Nodelist Compiler
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -41,10 +41,6 @@
#include "../lib/mberrors.h" #include "../lib/mberrors.h"
#define TMPNAME "TMP."
#define LCKNAME "LOCKFILE"
typedef struct _nl_list { typedef struct _nl_list {
struct _nl_list *next; struct _nl_list *next;
struct _nlidx idx; struct _nlidx idx;
@ -59,7 +55,6 @@ long total = 0, entries = 0;
int filenr = 0; int filenr = 0;
unsigned short regio; unsigned short regio;
nl_list *nll = NULL; nl_list *nll = NULL;
static char lockfile[81];
extern int do_quiet; /* Quiet flag */ extern int do_quiet; /* Quiet flag */
@ -68,73 +63,6 @@ time_t t_start; /* Start time */
time_t t_end; /* End 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 * If we don't know what to type
@ -179,7 +107,7 @@ void die(int onsig)
if (onsig && (onsig < NSIG)) if (onsig && (onsig < NSIG))
signal(onsig, SIG_IGN); signal(onsig, SIG_IGN);
ulockindex(); ulockprogram((char *)"mbindex");
if (!do_quiet) { if (!do_quiet) {
colour(3, 0); colour(3, 0);
@ -261,7 +189,7 @@ int main(int argc,char *argv[])
if (!diskfree(CFG.freespace)) if (!diskfree(CFG.freespace))
die(MBERR_DISK_FULL); die(MBERR_DISK_FULL);
if (lockindex()) { if (lockprogram((char *)"mbindex")) {
if (!do_quiet) if (!do_quiet)
printf("Can't lock mbindex, abort.\n"); printf("Can't lock mbindex, abort.\n");
die(MBERR_NO_PROGLOCK); die(MBERR_NO_PROGLOCK);

View File

@ -4,9 +4,9 @@
include ../Makefile.global include ../Makefile.global
SRCS = mutil.c mbmon.c common.c SRCS = mutil.c mbmon.c common.c proglock.c
HDRS = mutil.h mbmon.h common.h HDRS = mutil.h mbmon.h common.h proglock.h
OBJS = mutil.o mbmon.o common.o OBJS = mutil.o mbmon.o common.o proglock.o
LIBS += ../lib/libmemwatch.a LIBS += ../lib/libmemwatch.a
OTHER = Makefile OTHER = Makefile
@ -58,6 +58,7 @@ depend:
# DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT # DO NOT DELETE THIS LINE - MAKE DEPEND RELIES ON IT
# Dependencies generated by make depend # 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 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 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 # End of generated dependencies

View File

@ -5,7 +5,7 @@
* Todo ..................: Chat with user via server * Todo ..................: Chat with user via server
* *
***************************************************************************** *****************************************************************************
* Copyright (C) 1997-2002 * Copyright (C) 1997-2003
* *
* Michiel Broek FIDO: 2:280/2802 * Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10 * Beekmansbos 10
@ -35,6 +35,7 @@
#include "../lib/mberrors.h" #include "../lib/mberrors.h"
#include "../lib/structs.h" #include "../lib/structs.h"
#include "common.h" #include "common.h"
#include "proglock.h"
#include "mutil.h" #include "mutil.h"
@ -58,15 +59,22 @@ static void die(int onsig)
char buf[128]; char buf[128];
signal(onsig, SIG_IGN); signal(onsig, SIG_IGN);
/*
* Prevent clear screen when the program was locked
*/
if (onsig != MBERR_NO_PROGLOCK)
screen_stop(); screen_stop();
if (onsig && (onsig <= NSIG)) if (onsig && (onsig <= NSIG))
Syslog('?', "Finished on signal %s", SigName[onsig]); Syslog('?', "MBMON Finished on signal %s", SigName[onsig]);
else else
Syslog(' ', "Normally finished"); Syslog(' ', "MBMON Normally finished");
sprintf(buf, "CSYS:2,%d,0;", mypid); sprintf(buf, "CSYS:2,%d,0;", mypid);
if (socket_send(buf) == 0) if (socket_send(buf) == 0)
sprintf(buf, "%s", socket_receive()); sprintf(buf, "%s", socket_receive());
ulockprogram((char *)"mbmon");
ExitClient(0); ExitClient(0);
} }
@ -709,7 +717,7 @@ int main(int argc, char *argv[])
*/ */
pw = getpwuid(getuid()); pw = getpwuid(getuid());
InitClient(pw->pw_name); InitClient(pw->pw_name);
Syslog(' ', "Started by %s", pw->pw_name); Syslog(' ', "MBMON Started by %s", pw->pw_name);
bbs_free = FALSE; bbs_free = FALSE;
/* /*
@ -730,7 +738,6 @@ int main(int argc, char *argv[])
signal(SIGTERM,(void (*))die); signal(SIGTERM,(void (*))die);
signal(SIGKILL,(void (*))die); signal(SIGKILL,(void (*))die);
/* /*
* Find out if the environment variables LINES and COLUMNS are present, * Find out if the environment variables LINES and COLUMNS are present,
* if so, then use these for screen dimensions. * 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); 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"); screen_start((char *)"MBmon");

143
mbmon/proglock.c Normal file
View File

@ -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);
}

9
mbmon/proglock.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef _PROGLOCK_H
#define _PROGLOCK_H
/* $Id$ */
int lockprogram(char *);
void ulockprogram(char*);
#endif

View File

@ -88,7 +88,7 @@ static void die(int onsig)
int i; int i;
signal(onsig, SIG_IGN); signal(onsig, SIG_IGN);
if (!init) if ((!init) && (onsig != MBERR_NO_PROGLOCK))
screen_stop(); screen_stop();
if (exp_golded && (config_read() != -1)) { if (exp_golded && (config_read() != -1)) {
@ -143,6 +143,7 @@ static void die(int onsig)
free(temp); free(temp);
} }
ulockprogram((char *)"mbsetup");
umask(oldmask); umask(oldmask);
if (onsig && (onsig <= NSIG)) if (onsig && (onsig <= NSIG))
WriteError("MBSETUP finished on signal %s", SigName[onsig]); WriteError("MBSETUP finished on signal %s", SigName[onsig]);
@ -448,6 +449,12 @@ int main(int argc, char *argv[])
Syslog(' ', "MBSETUP v%s started by %s", VERSION, pw->pw_name); Syslog(' ', "MBSETUP v%s started by %s", VERSION, pw->pw_name);
if (init) if (init)
Syslog('+', "Cmd: mbsetup 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; bbs_free = FALSE;
initdatabases(); initdatabases();

View File

@ -56,7 +56,6 @@ static onetask task[MAXTASKS]; /* Array with tasks */
extern tocall calllist[MAXTASKS]; /* Array with calllist */ extern tocall calllist[MAXTASKS]; /* Array with calllist */
reg_info reginfo[MAXCLIENT]; /* Array with clients */ reg_info reginfo[MAXCLIENT]; /* Array with clients */
static pid_t pgrp; /* Pids group */ static pid_t pgrp; /* Pids group */
static char lockfile[PATH_MAX]; /* Lockfile */
int sock = -1; /* Datagram socket */ int sock = -1; /* Datagram socket */
struct sockaddr_un servaddr; /* Server address */ struct sockaddr_un servaddr; /* Server address */
struct sockaddr_un from; /* From address */ struct sockaddr_un from; /* From address */
@ -693,39 +692,48 @@ void die(int onsig)
*/ */
int locktask(char *root) int locktask(char *root)
{ {
char Tmpfile[81]; char *tempfile, *lockfile;
FILE *fp; FILE *fp;
pid_t oldpid; pid_t oldpid;
sprintf(Tmpfile, "%s/var/", root); tempfile = calloc(PATH_MAX, sizeof(char));
strcpy(lockfile, Tmpfile); lockfile = calloc(PATH_MAX, sizeof(char));
sprintf(Tmpfile + strlen(Tmpfile), "%s%u", TMPNAME, getpid());
sprintf(lockfile + strlen(lockfile), "%s", LCKNAME);
if ((fp = fopen(Tmpfile, "w")) == NULL) { sprintf(tempfile, "%s/var/run/mbtask.tmp", root);
sprintf(lockfile, "%s/var/run/mbtask", root);
if ((fp = fopen(tempfile, "w")) == NULL) {
perror("mbtask"); perror("mbtask");
printf("Can't create lockfile \"%s\"\n", Tmpfile); printf("Can't create lockfile \"%s\"\n", tempfile);
free(tempfile);
free(lockfile);
return 1; return 1;
} }
fprintf(fp, "%10u\n", getpid()); fprintf(fp, "%10u\n", getpid());
fclose(fp); fclose(fp);
while (TRUE) { while (TRUE) {
if (link(Tmpfile, lockfile) == 0) { if (link(tempfile, lockfile) == 0) {
unlink(Tmpfile); unlink(tempfile);
free(tempfile);
free(lockfile);
return 0; return 0;
} }
if ((fp = fopen(lockfile, "r")) == NULL) { if ((fp = fopen(lockfile, "r")) == NULL) {
perror("mbtask"); perror("mbtask");
printf("Can't open lockfile \"%s\"\n", Tmpfile); printf("Can't open lockfile \"%s\"\n", tempfile);
unlink(Tmpfile); unlink(tempfile);
free(tempfile);
free(lockfile);
return 1; return 1;
} }
if (fscanf(fp, "%u", &oldpid) != 1) { if (fscanf(fp, "%u", &oldpid) != 1) {
perror("mbtask"); perror("mbtask");
printf("Can't read old pid from \"%s\"\n", Tmpfile); printf("Can't read old pid from \"%s\"\n", tempfile);
fclose(fp); fclose(fp);
unlink(Tmpfile); unlink(tempfile);
free(tempfile);
free(lockfile);
return 1; return 1;
} }
fclose(fp); fclose(fp);
@ -737,12 +745,16 @@ int locktask(char *root)
} else { } else {
perror("mbtask"); perror("mbtask");
printf("Kill for %u failed\n",oldpid); printf("Kill for %u failed\n",oldpid);
unlink(Tmpfile); unlink(tempfile);
free(tempfile);
free(lockfile);
return 1; return 1;
} }
} else { } else {
printf("Another mbtask is already running, pid=%u\n", oldpid); printf("Another mbtask is already running, pid=%u\n", oldpid);
unlink(Tmpfile); unlink(tempfile);
free(tempfile);
free(lockfile);
return 1; return 1;
} }
} }
@ -752,8 +764,35 @@ int locktask(char *root)
void ulocktask(void) void ulocktask(void)
{ {
if (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); (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) int main(int argc, char **argv)
{ {
struct passwd *pw; struct passwd *pw;
char *lockfile;
int i; int i;
pid_t frk; pid_t frk;
FILE *fp; FILE *fp;
@ -1365,10 +1405,13 @@ int main(int argc, char **argv)
* run the deamon process. Put the child's pid * run the deamon process. Put the child's pid
* in the lockfile before leaving. * 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"))) { if ((fp = fopen(lockfile, "w"))) {
fprintf(fp, "%10u\n", frk); fprintf(fp, "%10u\n", frk);
fclose(fp); fclose(fp);
} }
free(lockfile);
Syslog('+', "Starting daemon with pid %d", frk); Syslog('+', "Starting daemon with pid %d", frk);
exit(MBERR_OK); exit(MBERR_OK);
} }

View File

@ -10,8 +10,6 @@
*/ */
#define MAXTASKS 10 #define MAXTASKS 10
#define SLOWRUN 20 #define SLOWRUN 20
#define TMPNAME "TMP."
#define LCKNAME "LOCKTASK"
@ -53,6 +51,4 @@ void scheduler(void);
int locktask(char *); int locktask(char *);
void ulocktask(void); void ulocktask(void);
#endif #endif