X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=xtrlock.c;h=6117c6fadbc596805a9f6f32fded1fb5ae0c07b2;hb=6f8396e3a1607537a1cd6903d3d0f1a14e6f3476;hp=3d5ce704eb5e4bf91059c15364555f1b54de11d3;hpb=8382c6f9d7f17373aa235ebe1a242bf56e7eb25e;p=xtrlock.git diff --git a/xtrlock.c b/xtrlock.c index 3d5ce70..6117c6f 100644 --- a/xtrlock.c +++ b/xtrlock.c @@ -81,19 +81,27 @@ int main(int argc, char **argv){ Cursor cursor; Pixmap csr_source,csr_mask; XColor csr_fg, csr_bg, dummy, black; - int ret, screen, blank = 0; + int ret, screen, blank = 0, fork_after = 0; #ifdef SHADOW_PWD struct spwd *sp; #endif struct timeval tv; int tvt, gs; - if ((argc == 2) && (strcmp(argv[1], "-b") == 0)) { - blank = 1; - } else if (argc > 1) { - fprintf(stderr,"xtrlock (version %s); usage: xtrlock [-b]\n", - program_version); - exit(1); + while (argc > 1) { + if ((strcmp(argv[1], "-b") == 0)) { + blank = 1; + argc--; + argv++; + } else if ((strcmp(argv[1], "-f") == 0)) { + fork_after = 1; + argc--; + argv++; + } else { + fprintf(stderr,"xtrlock (version %s); usage: xtrlock [-b] [-f]\n", + program_version); + exit(1); + } } errno=0; pw= getpwuid(getuid()); @@ -108,10 +116,10 @@ int main(int argc, char **argv){ /* logically, if we need to do the following then the same applies to being installed setgid shadow. we do this first, because of a bug in linux. --jdamery */ - setgid(getgid()); + if (setgid(getgid())) { perror("setgid"); exit(1); } /* we can be installed setuid root to support shadow passwords, and we don't need root privileges any longer. --marekm */ - setuid(getuid()); + if (setuid(getuid())) { perror("setuid"); exit(1); } if (strlen(pw->pw_passwd) < 13) { fputs("password entry has no pwd\n",stderr); exit(1); @@ -208,6 +216,17 @@ int main(int argc, char **argv){ exit(1); } + if (fork_after) { + pid_t pid = fork(); + if (pid < 0) { + fprintf(stderr,"xtrlock (version %s): cannot fork: %s\n", + program_version, strerror(errno)); + exit(1); + } else if (pid > 0) { + exit(0); + } + } + for (;;) { XNextEvent(display,&ev); switch (ev.type) {