/* * lockfile.c: * * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ static char rcsid[] = "$Id$"; /* * $Log$ * Revision 1.2 2008/02/15 16:48:56 james * *** empty log message *** * * Revision 1.1 2008/02/15 15:09:17 james * *** empty log message *** * */ #define LOCK_ASCII #undef LOCK_BINARY Filelist *filelist_new(void) { } static int chown_uucp (fd) int 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; } } return fchown (fd, uuid, ugid); } int lockfile_make { char buf[1024], tmpfn[1024]; char *ptr; int fd; int i; strcpy (tmpfn, name); ptr = rindex (tmpfn, '/'); if (!ptr) return -1; ptr++; ptr += sprintf (ptr, "LTMP.%d", getpid ()); *ptr = 0; i = sprintf (buf, "%10d\n", getpid ()); fd = open (tmpfn, O_WRONLY | O_CREAT | O_TRUNC, 0444); if (fd < 0) { unlink (tmpfn); return -1; } write (fd, buf, i); fchmod (fd, 044); if (chown_uucp (fd)) { close (fd); unlink (tmpfn); return -1; } close (fd); if (link (tmpfn, name) < 0) { unlink (tmpfn); return -1; } unlink (tmpfn); return 0; } void lockfile_add_name_from_path (File_list *fl,char *ptr) { printf ("lock by file %s\n", ptr); } void lockfile_add_name_from_dev (File_list *fl,dev_t dev) { printf ("lock by dev %x\n", dev); } void lockfile_check_dir_for_dev(File_list *fl,char *dir,dev_t dev) { char buf[1024]; struct stat ent_stat; struct dirent *de; DIR *d; for (d = opendir (DEV); (de = readdir (d));) { strcpy (buf, DEV); 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; lockfile_add_name_from_path (fl,buf); } closedir (d); } File_list * construct_possible_lock_files (char *device) { struct stat dev_stat; File_list *ret=NULL; if (stat (device, &dev_stat)) return ret; if (!S_ISCHR (dev_stat.st_mode)) return ret; ret=filelist_new(); lockfile_add_name_from_dev (ret,dev_stat.st_rdev); 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); return ret; }