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());
/* 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);
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);
gs=0; /*gs==grab successful*/
for (tvt=0 ; tvt<100; tvt++) {
- ret = XGrabKeyboard(display,window,False,GrabModeAsync,GrabModeAsync,
+ ret = XGrabKeyboard(display,window,False,
+ GrabModeSync, /* pointer_mode */
+ GrabModeAsync, /* keyboard_mode */
CurrentTime);
if (ret == GrabSuccess) {
gs=1;
}
if (XGrabPointer(display,window,False,(KeyPressMask|KeyReleaseMask)&0,
- GrabModeAsync,GrabModeAsync,None,
- cursor,CurrentTime)!=GrabSuccess) {
+ GrabModeSync, /* pointer_mode */
+ GrabModeAsync, /* keyboard_mode */
+ None,
+ cursor,CurrentTime)!=GrabSuccess) {
XUngrabKeyboard(display,CurrentTime);
fprintf(stderr,"xtrlock (version %s): cannot grab pointer\n",
program_version);
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) {