4 * Copyright (c) 2008 James McKenzie <james@fishsoup.dhs.org>,
9 static char rcsid[] = "$Id$";
13 * Revision 1.3 2008/02/15 18:16:35 james
14 * *** empty log message ***
16 * Revision 1.2 2008/02/15 16:48:56 james
17 * *** empty log message ***
19 * Revision 1.1 2008/02/15 15:09:17 james
20 * *** empty log message ***
28 #include <sys/types.h>
44 Filelist *fl = (Filelist *) malloc (sizeof (Filelist));
52 filelist_remove (Filelist * fl, Filelist_ent * fle)
56 for (ep = &fl->head; *ep; ep = &((*ep)->next))
70 filelist_add (Filelist * fl, char *fn)
75 if (i >= FILE_LIST_MAX_LEN)
78 for (fle=fl->head;fle;fle=fle->next)
79 if (!strcmp(fle->name,fn)) return;
81 fle = malloc (sizeof (Filelist_ent));
83 strcpy (fle->name, fn);
90 filelist_free (Filelist * fl)
93 filelist_remove (fl, fl->head);
97 void filelist_print(Filelist *fl,FILE *f)
101 fprintf(f,"(empty list)\n");
104 for (fle=fl->head;fle;fle=fle->next)
105 fprintf(f,"%s\n",fle->name);
115 static int uuid = -1, ugid;
120 if (pw = getpwnam ("uucp"))
130 return fchown (fd, uuid, ugid);
134 lockfile_make (char *name)
136 char buf[1024], tmpfn[1024];
141 strcpy (tmpfn, name);
143 ptr = rindex (tmpfn, '/');
149 ptr += sprintf (ptr, "LTMP.%d", getpid ());
152 i = sprintf (buf, "%10d\n", getpid ());
155 fd = open (tmpfn, O_WRONLY | O_CREAT | O_TRUNC, 0444);
173 if (link (tmpfn, name) < 0)
185 lockfile_add_places (Filelist * fl, char *leaf)
190 { "/var/lock/uucp", "/var/spool/lock", "/var/spool/uucp", "/etc/locks",
191 "/usr/spool/uucp", "/var/spool/locks", "/usr/spool/lock",
193 "/usr/spool/uucp/LCK"
197 for (i = 0; i < (sizeof (lock_dirs) / sizeof (char *)); ++i)
199 if (stat (lock_dirs[i], &stbuf))
201 strcpy (buf, lock_dirs[i]);
204 filelist_add (fl, buf);
210 do_tedious_mangling (Filelist * fl, char *buf, char *ptr, char inv, int lower)
214 if (lower && (*ptr >= 'A') && (*ptr <= 'Z'))
221 lockfile_add_places (fl, buf);
226 lockfile_regularize_and_add (Filelist * fl, char *leaf)
228 char buf[1024] = "LCK..";
239 do_tedious_mangling (fl, buf, ptr, '_', 0);
241 do_tedious_mangling (fl, buf, ptr, '_', 1);
243 do_tedious_mangling (fl, buf, ptr, '.', 0);
245 do_tedious_mangling (fl, buf, ptr, '.', 1);
249 lockfile_add_name_from_path (Filelist * fl, char *file)
256 lockfile_regularize_and_add (fl, ptr);
258 if (!strncmp (ptr, "dev/", 4))
261 lockfile_regularize_and_add (fl, ptr);
267 lockfile_add_name_from_dev (Filelist * fl, dev_t dev)
270 sprintf (buf, "LCK.%03d.%03d", major (dev), minor (dev));
271 lockfile_add_places (fl, buf);
275 lockfile_check_dir_for_dev (Filelist * fl, char *dir, dev_t dev)
278 struct stat ent_stat;
286 while ((de = readdir (d)))
289 strcat (buf, de->d_name);
291 if (stat (buf, &ent_stat))
293 if (!S_ISCHR (ent_stat.st_mode))
295 if (ent_stat.st_rdev != dev)
298 lockfile_add_name_from_path (fl, buf);
305 lockfile_make_list(char *device)
307 struct stat dev_stat;
308 Filelist *ret = NULL;
311 if (stat (device, &dev_stat))
313 if (!S_ISCHR (dev_stat.st_mode))
316 ret = filelist_new ();
318 lockfile_add_name_from_dev (ret, dev_stat.st_rdev);
320 lockfile_add_name_from_path (ret, device);
322 lockfile_check_dir_for_dev (ret, "/dev/", dev_stat.st_rdev);
323 lockfile_check_dir_for_dev (ret, "/dev/usb/", dev_stat.st_rdev);
324 lockfile_check_dir_for_dev (ret, "/dev/tts/", dev_stat.st_rdev);
329 void lockfile_remove_stale(Filelist *fl)
336 Filelist *lockfile_lock(Filelist *fl)
343 lockfile_remove_stale(fl);
345 for (fle=fl->head;fle;fle=fle->next) {
346 if (lockfile_make(fle->name)) {
347 fprintf(stderr,"Failed to get lockfile %s\n",fle->name);
351 filelist_add(ret,fle->name);
358 int main(int argc,char *argv[])
360 Filelist *fl=lockfile_make_list("/dev/ttyS0");
364 filelist_print(fl,stdout);
366 fll=lockfile_lock(fl);
368 filelist_print(fll,stdout);