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
# Maintainer: domanov <_domanov_@_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 }
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);