X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flockfile.c;h=569e02f0d865faeb06dac2c595271539f475f317;hb=refs%2Fheads%2Fmaster;hp=b3252746a902fcb82aa01be5e9d5bbaaa26bac6a;hpb=1191192d054da2be10658472c29f95e2494ea18f;p=sympathy.git diff --git a/src/lockfile.c b/src/lockfile.c index b325274..569e02f 100644 --- a/src/lockfile.c +++ b/src/lockfile.c @@ -1,15 +1,43 @@ -/* +/* * lockfile.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = + "$Id: lockfile.c,v 1.17 2010/07/16 11:04:10 james Exp $"; -/* - * $Log$ +/* + * $Log: lockfile.c,v $ + * Revision 1.17 2010/07/16 11:04:10 james + * ignore tedious return values + * + * Revision 1.16 2008/05/09 12:56:11 james + * *** empty log message *** + * + * Revision 1.15 2008/03/07 14:13:40 james + * *** empty log message *** + * + * Revision 1.14 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.13 2008/03/07 12:37:04 james + * *** empty log message *** + * + * Revision 1.12 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.11 2008/03/02 10:38:18 james + * *** empty log message *** + * + * Revision 1.10 2008/03/02 10:37:56 james + * *** empty log message *** + * + * Revision 1.9 2008/02/15 23:52:12 james + * *** empty log message *** + * * Revision 1.8 2008/02/15 20:52:36 james * *** empty log message *** * @@ -39,6 +67,8 @@ static char rcsid[] = "$Id$"; #define LOCK_ASCII #undef LOCK_BINARY +#define STALE_CHECK_INTERVAL 10 + #include #include #include @@ -51,13 +81,17 @@ static char rcsid[] = "$Id$"; #include #include #include +#include +#include #include "lockfile.h" +extern void *xmalloc (size_t); + Filelist * filelist_new (void) { - Filelist *fl = (Filelist *) malloc (sizeof (Filelist)); + Filelist *fl = (Filelist *) xmalloc (sizeof (Filelist)); fl->head = NULL; @@ -95,7 +129,7 @@ filelist_add (Filelist * fl, char *fn) if (!strcmp (fle->name, fn)) return; - fle = malloc (sizeof (Filelist_ent)); + fle = xmalloc (sizeof (Filelist_ent)); strcpy (fle->name, fn); @@ -115,11 +149,10 @@ void filelist_print (Filelist * fl, FILE * f) { Filelist_ent *fle; - if (!fl) - { - fprintf (f, "(empty list)\n"); - return; - } + if (!fl) { + fprintf (f, "(empty list)\n"); + return; + } for (fle = fl->head; fle; fle = fle->next) fprintf (f, "%s\n", fle->name); } @@ -134,18 +167,14 @@ chown_uucp (fd) static int uuid = -1, ugid; struct passwd *pw; - if (uuid < 0) - { - if (pw = getpwnam ("uucp")) - { - uuid = pw->pw_uid; - ugid = pw->pw_gid; - } - else - { - return -1; - } + if (uuid < 0) { + if (pw = getpwnam ("uucp")) { + uuid = pw->pw_uid; + ugid = pw->pw_gid; + } else { + return -1; } + } return fchown (fd, uuid, ugid); } @@ -172,28 +201,30 @@ lockfile_make (char *name) unlink (tmpfn); fd = open (tmpfn, O_WRONLY | O_CREAT | O_TRUNC, 0444); - if (fd < 0) - { - unlink (tmpfn); - return -1; - } + if (fd < 0) { + unlink (tmpfn); + return -1; + } - write (fd, buf, i); + int result; + result = write (fd, buf, i); fchmod (fd, 044); - if (chown_uucp (fd)) - { - close (fd); - unlink (tmpfn); - return -1; - } +#if 0 + if (chown_uucp (fd)) { + close (fd); + unlink (tmpfn); + return -1; + } +#else + chown_uucp (fd); +#endif close (fd); - if (link (tmpfn, name) < 0) - { - unlink (tmpfn); - return -1; - } + if (link (tmpfn, name) < 0) { + unlink (tmpfn); + return -1; + } unlink (tmpfn); return 0; @@ -208,33 +239,31 @@ lockfile_add_places (Filelist * fl, char *leaf) char *lock_dirs[] = { "/var/lock/uucp", "/var/spool/lock", "/var/spool/uucp", "/etc/locks", "/usr/spool/uucp", "/var/spool/locks", "/usr/spool/lock", - "/usr/spool/locks", "/usr/spool/uucp/LCK" + "/usr/spool/locks", "/usr/spool/uucp/LCK", "/var/lock" }; int i; - for (i = 0; i < (sizeof (lock_dirs) / sizeof (char *)); ++i) - { - if (stat (lock_dirs[i], &stbuf)) - continue; - strcpy (buf, lock_dirs[i]); - strcat (buf, "/"); - strcat (buf, leaf); - filelist_add (fl, buf); - } + for (i = 0; i < (sizeof (lock_dirs) / sizeof (char *)); ++i) { + if (stat (lock_dirs[i], &stbuf)) + continue; + strcpy (buf, lock_dirs[i]); + strcat (buf, "/"); + strcat (buf, leaf); + filelist_add (fl, buf); + } } static void do_tedious_mangling (Filelist * fl, char *buf, char *ptr, char inv, int lower) { - while (*ptr) - { - if (lower && (*ptr >= 'A') && (*ptr <= 'Z')) - *ptr |= 32; - if (*ptr == '/') - *ptr = inv; - ptr++; - } + while (*ptr) { + if (lower && (*ptr >= 'A') && (*ptr <= 'Z')) + *ptr |= 32; + if (*ptr == '/') + *ptr = inv; + ptr++; + } lockfile_add_places (fl, buf); } @@ -273,11 +302,10 @@ lockfile_add_name_from_path (Filelist * fl, char *file) ptr++; lockfile_regularize_and_add (fl, ptr); - if (!strncmp (ptr, "dev/", 4)) - { - ptr += 4; - lockfile_regularize_and_add (fl, ptr); - } + if (!strncmp (ptr, "dev/", 4)) { + ptr += 4; + lockfile_regularize_and_add (fl, ptr); + } } @@ -302,21 +330,20 @@ lockfile_check_dir_for_dev (Filelist * fl, char *dir, dev_t dev) if (!d) return; - while ((de = readdir (d))) - { - strcpy (buf, dir); - strcat (buf, de->d_name); + while ((de = readdir (d))) { + strcpy (buf, dir); + strcat (buf, de->d_name); - if (stat (buf, &ent_stat)) - continue; - if (!S_ISCHR (ent_stat.st_mode)) - continue; - if (ent_stat.st_rdev != dev) - continue; + if (stat (buf, &ent_stat)) + continue; + if (!S_ISCHR (ent_stat.st_mode)) + continue; + if (ent_stat.st_rdev != dev) + continue; - lockfile_add_name_from_path (fl, buf); + lockfile_add_name_from_path (fl, buf); - } + } closedir (d); } @@ -334,13 +361,15 @@ lockfile_make_list (char *device) ret = filelist_new (); - lockfile_add_name_from_dev (ret, dev_stat.st_rdev); + if (ret) { + lockfile_add_name_from_dev (ret, dev_stat.st_rdev); - lockfile_add_name_from_path (ret, device); + lockfile_add_name_from_path (ret, device); - lockfile_check_dir_for_dev (ret, "/dev/", dev_stat.st_rdev); - lockfile_check_dir_for_dev (ret, "/dev/usb/", dev_stat.st_rdev); - lockfile_check_dir_for_dev (ret, "/dev/tts/", dev_stat.st_rdev); + lockfile_check_dir_for_dev (ret, "/dev/", dev_stat.st_rdev); + lockfile_check_dir_for_dev (ret, "/dev/usb/", dev_stat.st_rdev); + lockfile_check_dir_for_dev (ret, "/dev/tts/", dev_stat.st_rdev); + } return ret; } @@ -363,31 +392,28 @@ remove_stale_lock (char *path) apid[length] = 0; pid = 0; - if (length == sizeof (pid) || sscanf (apid, "%d", &pid) != 1 || pid == 0) - { - pid = *((int *) apid); + if (length == sizeof (pid) || sscanf (apid, "%d", &pid) != 1 || pid == 0) { + pid = *((int *) apid); #ifdef LOCK_ASCII - fprintf (stderr, - "compiled with ascii locks, found binary lock file (length=%d, pid=%d)!", - length, pid); + fprintf (stderr, + "compiled with ascii locks, found binary lock file (length=%d, pid=%d)!", + length, pid); #endif - } + } #ifdef LOCK_BINARY - else - { - fprintf (stderr, - "compiled with binary locks, found ascii lock file (length=%d, pid=%d)!", - length, pid); - } + else { + fprintf (stderr, + "compiled with binary locks, found ascii lock file (length=%d, pid=%d)!", + length, pid); + } #endif close (fd); - if ((kill (pid, 0) < 0) && (errno == ESRCH)) - { - fprintf (stderr, "removing stale lock file %s\n", path); - unlink (path); - } + if ((kill (pid, 0) < 0) && (errno == ESRCH)) { + fprintf (stderr, "removing stale lock file %s\n", path); + unlink (path); + } } @@ -397,12 +423,11 @@ lockfile_remove_stale (Filelist * fl) Filelist_ent *fle; struct stat buf; - for (fle = fl->head; fle; fle = fle->next) - { - if (stat (fle->name, &buf)) - continue; - remove_stale_lock (fle->name); - } + for (fle = fl->head; fle; fle = fle->next) { + if (stat (fle->name, &buf)) + continue; + remove_stale_lock (fle->name); + } } @@ -416,18 +441,18 @@ lockfile_lock (Filelist * fl) ret = filelist_new (); - lockfile_remove_stale (fl); + if (ret) { + lockfile_remove_stale (fl); - for (fle = fl->head; fle; fle = fle->next) - { - if (lockfile_make (fle->name)) - { - fprintf (stderr, "Failed to get lockfile %s\n", fle->name); - filelist_free (ret); - return NULL; - } + for (fle = fl->head; fle; fle = fle->next) { + if (lockfile_make (fle->name)) { + fprintf (stderr, "Failed to get lockfile %s\n", fle->name); + filelist_free (ret); + return NULL; + } filelist_add (ret, fle->name); } + } return ret; } @@ -436,11 +461,10 @@ void lockfile_unlock (Filelist * fl) { - while (fl->head) - { - unlink (fl->head->name); - filelist_remove (fl, fl->head); - } + while (fl->head) { + unlink (fl->head->name); + filelist_remove (fl, fl->head); + } } @@ -457,23 +481,21 @@ serial_lock_check (Serial_lock * l) if (l->mode == SERIAL_LOCK_ACTIVE) return 0; - for (fle = l->locks_to_check; fle; fle = fle->next) - { - if (!stat (fle->name, &buf)) - locks_found++; - } + for (fle = l->locks_to_check->head; fle; fle = fle->next) { + if (!stat (fle->name, &buf)) + locks_found++; + } if (!locks_found) return 0; - getimeofday (&now, NULL); + gettimeofday (&now, NULL); timersub (&now, &l->last_stale_purge, &dif); - if (dif.tv_sec > STALE_CHECK_INTERVAL) - { - lockfile_remove_stale (l->locks_to_check); - l->last_stale_purge = now; - } + if (dif.tv_sec > STALE_CHECK_INTERVAL) { + lockfile_remove_stale (l->locks_to_check); + l->last_stale_purge = now; + } return 1; } @@ -484,16 +506,14 @@ serial_lock_free (Serial_lock * l) if (!l) return; - if (l->locks_held) - { - lockfile_unlock (l->locks_held); - filelist_free (l->locks_held); - } + if (l->locks_held) { + lockfile_unlock (l->locks_held); + filelist_free (l->locks_held); + } - if (l->locks_to_check) - { - filelist_free (l->locks_to_check); - } + if (l->locks_to_check) { + filelist_free (l->locks_to_check); + } free (l); } @@ -503,10 +523,13 @@ Serial_lock * serial_lock_new (char *dev, int mode) { Filelist *fl = lockfile_make_list (dev); + Serial_lock *l; if (!fl) return NULL; + l = (Serial_lock *) xmalloc (sizeof (Serial_lock)); + l->mode = mode; l->locks_to_check = fl; l->locks_held = NULL; @@ -516,17 +539,16 @@ serial_lock_new (char *dev, int mode) return l; l->locks_held = lockfile_lock (l->locks_to_check); - if (!l->locks_held) - { - serial_lock_free (l); - return NULL; - } + if (!l->locks_held) { + serial_lock_free (l); + return NULL; + } return l; } -#if 1 +#if 0 int main (int argc, char *argv[]) {