zeeff@b-tech.ann-arbor.mi.us (Jon Zeeff) (12/12/89)
Archive-name: uulock Original-posting-by: zeeff@b-tech.ann-arbor.mi.us (Jon Zeeff) Original-subject: KA9Q questions Reposted-by: emv@math.lsa.umich.edu (Edward Vielmetti) [This is an experimental alt.sources re-posting from the newsgroup(s) mi.misc. Comments on this service to emv@math.lsa.umich.edu (Edward Vielmetti).] >(Anyone tried to implement locking so uucp doesn't get upset?) Here is something I wrote for HDB uucp. Could probably be easily modified for others. /* Lock a tty and then run a program. Blow away old locks. Written for Sys V with HDB style locks. Written by Jon Zeeff (zeeff@b-tech.ann-arbor.mi.us) This program placed in the public domain. */ #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <signal.h> #include <fcntl.h> #include <termio.h> #include <sys/errno.h> char *strcpy(); char *strcat(); unsigned sleep(); unsigned alarm(); void exit(); int pid; FILE *lock; char tty_lock[100]; main(argc,argv) int argc; char **argv; { if (argc < 3) { fprintf(stderr,"Usage: uulock tty command args\n"); exit(1); } /* create a hdb style lock file */ strcpy(tty_lock,"/usr/spool/locks/LCK.."); strcat(tty_lock,argv[1]); check_lock(tty_lock); umask(022); lock = fopen(tty_lock,"w"); if (lock) { fprintf(lock,"%10.10d\n",(int)getpid()); fclose(lock); if (pid = fork()) { int w; while ((w = wait((int *)0)) != pid && w != -1); unlink(tty_lock); } else { execvp(argv[2],&argv[2]); printf("Can't exec that program\n"); exit(2); } } else { fprintf(stderr,"tty port in use\n"); return 2; } return 0; } /* remove a lock file if the process is no longer there */ check_lock(file_name) char *file_name; { int fd; char lock_pid[11]; extern int errno; if ((fd = open(file_name, O_RDONLY)) == -1) { unlink(file_name); return 0; } read(fd,lock_pid, 10); close(fd); if ((kill(atoi(lock_pid), 0)) == 0 || errno == EPERM) return 1; /* process is active */ unlink(file_name); return 0; } -- Jon Zeeff zeeff@b-tech.ann-arbor.mi.us or b-tech!zeeff