[arch-general] Seemingly archlinux specific problem with logkeys

Dennis Herbrich dennis at archlinux.org
Wed Jan 4 07:34:24 EST 2012


On Wed, Jan 04, 2012 at 07:03:56AM -0500, Scott Lawrence wrote:
> On 01/04/2012 06:33 AM, SanskritFritz wrote:
> > I started a topic on the forum, but we didnt reach to any solution:
> > https://bbs.archlinux.org/viewtopic.php?id=129528
> > 
> > In hope for a more competent audience, I repost my question now here:
> > 
> > It looks like there is an archlinux specific problem with logkeys:
> > http://code.google.com/p/logkeys/issues/detail?id=60
> > I also am hit by this, and would like to ask for your help guys. Any
> > idea what could cause this?
> > In a nutshell:
> > 
> > strace -f logkeys -s
> > shows that the logfile could not be written for some reason:
> > [pid 10516] write(1, "Logging started ...\n\n2011-11-02 "..., 48) = -1
> > EBADF (Bad file descriptor)
> > 
> > The comments all have in common that they use archlinux, hence I dared
> > to post here.
> 
> Huh. logkeys apparently does some stunny fuff with stdout
> (stdout=freopen(fname, "a", stdout) instead of just fopen'ing a new
> file) - changing that to be more "normal" fixes the problem for me.
> Attached is my patch for this. (I'll also stick it on the issue tracker.)

Yeah, I verified the issue and came to the same conclusion. Re-assigning stdout
that way is not supposed to happen, and seemingly unnecessary, too.

To actually add something to the discussion, please find my fixed PKGBUILD and
patch for ABS attached. It's basically the same as Scott's with minor stylistic
differences. 

Regards,
  Dennis

-- 
"Den Rechtsstaat macht aus, dass Unschuldige wieder frei kommen."
  Dr. Wolfgang Schäuble, Bundesinnenminister (14.10.08, TAZ-Interview)

0D21BE6C - F3DC D064 BB88 5162 56BE  730F 5471 3881 0D21 BE6C
-------------- next part --------------
# Maintainer: domanov <_domanov_ at _gmail_.com>
pkgname=logkeys
pkgver=0.1.1a
pkgrel=3
pkgdesc="A simple keylogger"
arch=('i686' 'x86_64')
url="http://code.google.com/p/logkeys/"
license=('GPLv3')
source=(http://logkeys.googlecode.com/files/$pkgname-$pkgver.tar.gz logkeys-stdout.patch)
md5sums=('19362a382b65e89c66ea4c5642297589' 'c11258ab13560081c2cdb56ccd31c6cd')
optdepends=('logkeys-keymap: for keymaps other than standard en_US')
build() {
     cd $srcdir/$pkgname-$pkgver
     patch -p1 < $srcdir/logkeys-stdout.patch
     ./configure --prefix=/usr
     make || return 1
     make prefix=$pkgdir/usr install
}

-------------- next part --------------
diff -urN logkeys-0.1.1a.org/src/logkeys.cc logkeys-0.1.1a/src/logkeys.cc
--- logkeys-0.1.1a.org/src/logkeys.cc	2010-05-31 07:04:57.000000000 +0200
+++ logkeys-0.1.1a/src/logkeys.cc	2012-01-04 13:18:49.000000000 +0100
@@ -237,8 +237,7 @@
   memset(shift_keys, '\0', sizeof(shift_keys));
   memset(altgr_keys, '\0', sizeof(altgr_keys));
   
-  stdin = freopen(args.keymap, "r", stdin);
-  if (stdin == NULL)
+  if (freopen(args.keymap, "r", stdin) == NULL)
     error(EXIT_FAILURE, errno, "Error opening input keymap '%s'", args.keymap);
   
   unsigned int i = -1;
@@ -354,7 +353,9 @@
 
 
 int main(int argc, char **argv)
-{  
+{ 
+  FILE *ofp;
+ 
   on_exit(exit_cleanup, NULL);
   
   if (geteuid()) error(EXIT_FAILURE, errno, "Got r00t?");
@@ -424,10 +425,10 @@
     setegid(getgid());
   }
   
-  // open log file as stdout (if file doesn't exist, create it with safe 0600 permissions)
+  // open log file (if file doesn't exist, create it with safe 0600 permissions)
   umask(0177);
-  stdout = freopen(args.logfile, "a", stdout);
-  if (stdout == NULL)
+  ofp = fopen(args.logfile, "a");
+  if (ofp == NULL)
     error(EXIT_FAILURE, errno, "Error opening output file '%s'", args.logfile);
   
   // now we need those privileges back in order to create system-wide PID_FILE
@@ -457,10 +458,10 @@
   strftime(timestamp, sizeof(timestamp), TIME_FORMAT, localtime(&cur_time));
   
   if (args.flags & FLAG_NO_TIMESTAMPS)
-    file_size += fprintf(stdout, "Logging started at %s\n\n", timestamp);
+    file_size += fprintf(ofp, "Logging started at %s\n\n", timestamp);
   else
-    file_size += fprintf(stdout, "Logging started ...\n\n%s", timestamp);
-  fflush(stdout);
+    file_size += fprintf(ofp, "Logging started ...\n\n%s", timestamp);
+  fflush(ofp);
   
   // infinite loop: exit gracefully by receiving SIGHUP, SIGINT or SIGTERM (of which handler closes input_fd)
   while (read(input_fd, &event, sizeof(struct input_event)) > 0) {
@@ -476,14 +477,14 @@
     scan_code = event.code;
     
     if (scan_code >= sizeof(char_or_func)) {  // keycode out of range, log error
-      inc_size += fprintf(stdout, "<E-%x>", scan_code);
+      inc_size += fprintf(ofp, "<E-%x>", scan_code);
       if (inc_size > 0) file_size += inc_size;
       continue;
     }
     
     // if remote posting is enabled and size treshold is reached
     if (args.post_size != 0 && file_size >= args.post_size && stat(UPLOADER_PID_FILE, &st) == -1) {
-      fclose(stdout);
+      fclose(ofp);
       
       std::stringstream ss;
       for (int i = 1;; ++i) {
@@ -496,8 +497,8 @@
       if (rename(args.logfile, ss.str().c_str()) == -1)  // move current log file to indexed
         error(EXIT_FAILURE, errno, "Error renaming logfile");
       
-      stdout = fopen(args.logfile, "a");  // open empty log file with the same name
-      if (stdout == NULL)
+      ofp = fopen(args.logfile, "a");  // open empty log file with the same name
+      if (ofp == NULL)
         error(EXIT_FAILURE, errno, "Error opening output file '%s'", args.logfile);
       
       file_size = 0;  // new log file is now empty
@@ -521,7 +522,7 @@
           prev_code == KEY_LEFTSHIFT  || prev_code == KEY_RIGHTCTRL);  // if repeated key is modifier, do nothing
       else {
         if ((args.flags & FLAG_NO_FUNC_KEYS) && is_func_key(prev_code));  // if repeated was function key, and if we don't log function keys, then don't log repeat either
-        else inc_size += fprintf(stdout, "<#+%d>", count_repeats);
+        else inc_size += fprintf(ofp, "<#+%d>", count_repeats);
       }
       count_repeats = 0;  // reset count for future use
     }
@@ -533,12 +534,12 @@
       if (scan_code == KEY_ENTER || scan_code == KEY_KPENTER ||
           (ctrl_in_effect && (scan_code == KEY_C || scan_code == KEY_D))) {
         if (ctrl_in_effect)
-          inc_size += fprintf(stdout, "%lc", char_keys[to_char_keys_index(scan_code)]);  // log C or D
+          inc_size += fprintf(ofp, "%lc", char_keys[to_char_keys_index(scan_code)]);  // log C or D
         if (args.flags & FLAG_NO_TIMESTAMPS)
-          inc_size += fprintf(stdout, "\n");
+          inc_size += fprintf(ofp, "\n");
         else {
           strftime(timestamp, sizeof(timestamp), "\n" TIME_FORMAT, localtime(&event.time.tv_sec));
-          inc_size += fprintf(stdout, "%s", timestamp);  // then newline and timestamp
+          inc_size += fprintf(ofp, "%s", timestamp);  // then newline and timestamp
         }
         if (inc_size > 0) file_size += inc_size;
         continue;  // but don't log "<Enter>"
@@ -571,17 +572,17 @@
         else  // neither altgr nor shift are effective, this is a normal char
           wch = char_keys[to_char_keys_index(scan_code)];
         
-        if (wch != L'\0') inc_size += fprintf(stdout, "%lc", wch);  // write character to log file
+        if (wch != L'\0') inc_size += fprintf(ofp, "%lc", wch);  // write character to log file
       }
       else if (is_func_key(scan_code)) {
         if (!(args.flags & FLAG_NO_FUNC_KEYS)) {  // only log function keys if --no-func-keys not requested
-          inc_size += fprintf(stdout, "%ls", func_keys[to_func_keys_index(scan_code)]);
+          inc_size += fprintf(ofp, "%ls", func_keys[to_func_keys_index(scan_code)]);
         } 
         else if (scan_code == KEY_SPACE || scan_code == KEY_TAB) {
-          inc_size += fprintf(stdout, " ");  // but always log a single space for Space and Tab keys
+          inc_size += fprintf(ofp, " ");  // but always log a single space for Space and Tab keys
         }
       }
-      else inc_size += fprintf(stdout, "<E-%x>", scan_code);  // keycode is neither of character nor function, log error
+      else inc_size += fprintf(ofp, "<E-%x>", scan_code);  // keycode is neither of character nor function, log error
     } // if (EV_MAKE)
     
     // on key release
@@ -595,7 +596,7 @@
     }
     
     prev_code = scan_code;
-    fflush(stdout);
+    fflush(ofp);
     if (inc_size > 0) file_size += inc_size;
     
   } // while (read(input_fd))
@@ -603,9 +604,9 @@
   // append final timestamp, close files and exit
   time(&cur_time);
   strftime(timestamp, sizeof(timestamp), "%F %T%z", localtime(&cur_time));
-  fprintf(stdout, "\n\nLogging stopped at %s\n\n", timestamp);
+  fprintf(ofp, "\n\nLogging stopped at %s\n\n", timestamp);
   
-  fclose(stdout);
+  fclose(ofp);
   
   remove(PID_FILE);
   


More information about the arch-general mailing list