X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=xtrlock.git;a=blobdiff_plain;f=xtrlock.c;h=6117c6fadbc596805a9f6f32fded1fb5ae0c07b2;hp=49dff74a0ba879b93f8aacd199d3c6ad4f75c4eb;hb=6f8396e3a1607537a1cd6903d3d0f1a14e6f3476;hpb=2b4e9bf22463ed34f6f40611c92e14530f76d4c8 diff --git a/xtrlock.c b/xtrlock.c index 49dff74..6117c6f 100644 --- a/xtrlock.c +++ b/xtrlock.c @@ -80,17 +80,28 @@ int main(int argc, char **argv){ XSetWindowAttributes attrib; Cursor cursor; Pixmap csr_source,csr_mask; - XColor csr_fg, csr_bg, dummy; - int ret; + XColor csr_fg, csr_bg, dummy, black; + int ret, screen, blank = 0, fork_after = 0; #ifdef SHADOW_PWD struct spwd *sp; #endif struct timeval tv; int tvt, gs; - if (argc != 1) { - fprintf(stderr,"xtrlock (version %s): no arguments allowed\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()); @@ -105,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); @@ -121,11 +132,22 @@ int main(int argc, char **argv){ program_version); exit(1); } - + attrib.override_redirect= True; - window= XCreateWindow(display,DefaultRootWindow(display), - 0,0,1,1,0,CopyFromParent,InputOnly,CopyFromParent, - CWOverrideRedirect,&attrib); + + if (blank) { + screen = DefaultScreen(display); + attrib.background_pixel = BlackPixel(display, screen); + window= XCreateWindow(display,DefaultRootWindow(display), + 0,0,DisplayWidth(display, screen),DisplayHeight(display, screen), + 0,DefaultDepth(display, screen), CopyFromParent, DefaultVisual(display, screen), + CWOverrideRedirect|CWBackPixel,&attrib); + XAllocNamedColor(display, DefaultColormap(display, screen), "black", &black, &dummy); + } else { + window= XCreateWindow(display,DefaultRootWindow(display), + 0,0,1,1,0,CopyFromParent,InputOnly,CopyFromParent, + CWOverrideRedirect,&attrib); + } XSelectInput(display,window,KeyPressMask|KeyReleaseMask); @@ -194,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) {