--- /dev/null
+#include <stdio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/file.h>
+
+int main(int argc, unsigned char **argv)
+{
+ int c;
+ int fd, locktype;
+ pid_t pid;
+ int status;
+
+ locktype = LOCK_EX;
+ while((c = getopt(argc, argv, "se")) > 0)
+ {
+ switch(c)
+ {
+ case 's':
+ locktype = LOCK_SH;
+ break;
+ case 'e':
+ locktype = LOCK_EX;
+ break;
+ default:
+ return(1);
+ }
+ }
+ if(argc - optind < 2)
+ {
+ fprintf(stderr, "Wrong number of arguments\n");
+ return(1);
+ }
+ if((fd = open(argv[optind], O_RDWR | O_CREAT, 0600)) < 0)
+ {
+ perror(argv[optind]);
+ return(1);
+ }
+ optind++;
+ flock(fd, locktype);
+ if((pid = fork()) < 0)
+ {
+ perror("fork");
+ return(1);
+ } else if(!pid) {
+ execvp(argv[optind], argv + optind);
+ perror(argv[optind]);
+ exit(127);
+ }
+ while(wait(&status) != pid);
+ flock(fd, LOCK_UN);
+ return(status);
+}