chiark / gitweb /
Update version number
[xtrlock.git] / xtrlock.c
index 49dff74a0ba879b93f8aacd199d3c6ad4f75c4eb..6117c6fadbc596805a9f6f32fded1fb5ae0c07b2 100644 (file)
--- 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;
   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;
 
 #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());
   }
   
   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 */ 
   /* 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 */
   /* 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);
 
   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);
   }
            program_version);
     exit(1);
   }
-
+  
   attrib.override_redirect= True;
   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);
 
                         
   XSelectInput(display,window,KeyPressMask|KeyReleaseMask);
 
@@ -194,6 +216,17 @@ int main(int argc, char **argv){
     exit(1);
   }
 
     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) {
   for (;;) {
     XNextEvent(display,&ev);
     switch (ev.type) {