Add support for 'ltrace' in addition to 'strace' support.
Index: htop/TraceScreen.c
===================================================================
--- htop.orig/TraceScreen.c	2011-01-16 17:02:59.000000000 +0200
+++ htop/TraceScreen.c	2011-01-16 18:15:07.000000000 +0200
@@ -23,11 +23,17 @@
 
 /*{
 
+typedef enum TraceType_ {
+   STRACE,
+   LTRACE
+} TraceType;
+
 typedef struct TraceScreen_ {
    Process* process;
    Panel* display;
    FunctionBar* bar;
    bool tracing;
+   TraceType type;
 } TraceScreen;
 
 }*/
@@ -38,9 +44,10 @@
 
 static int tsEvents[] = {KEY_F(4), KEY_F(5), 27};
 
-TraceScreen* TraceScreen_new(Process* process) {
+TraceScreen* TraceScreen_new(Process* process, TraceType type) {
    TraceScreen* this = (TraceScreen*) malloc(sizeof(TraceScreen));
    this->process = process;
+   this->type = type;
    this->display = Panel_new(0, 1, COLS, LINES-2, LISTITEM_CLASS, true, ListItem_compare);
    this->bar = FunctionBar_new(tsFunctions, tsKeys, tsEvents);
    this->tracing = true;
@@ -56,7 +63,14 @@
 static void TraceScreen_draw(TraceScreen* this) {
    attrset(CRT_colors[PANEL_HEADER_FOCUS]);
    mvhline(0, 0, ' ', COLS);
-   mvprintw(0, 0, "Trace of process %d - %s", this->process->pid, this->process->comm);
+   switch(this->type) {
+       case STRACE:
+          mvprintw(0, 0, "Trace of process %d - %s (STRACE)", this->process->pid, this->process->comm);
+          break;
+       case LTRACE:
+          mvprintw(0, 0, "Trace of process %d - %s (LTRACE)", this->process->pid, this->process->comm);
+          break;
+   }
    attrset(CRT_colors[DEFAULT_COLOR]);
    FunctionBar_draw(this->bar, NULL);
 }
@@ -73,15 +87,24 @@
       dup2(fdpair[1], STDERR_FILENO);
       fcntl(fdpair[1], F_SETFL, O_NONBLOCK);
       sprintf(buffer, "%d", this->process->pid);
-      execlp("strace", "strace", "-p", buffer, NULL);
-      const char* message = "Could not execute 'strace'. Please make sure it is available in your $PATH.";
+      const char* message;
+      switch(this->type) {
+         case STRACE:
+            execlp("strace", "strace", "-p", buffer, NULL);
+            message = "Could not execute 'strace'. Please make sure it is available in your $PATH.";
+            break;
+         case LTRACE:
+            execlp("ltrace", "ltrace", "-p", buffer, NULL);
+            message = "Could not execute 'ltrace'. Please make sure it is available in your $PATH.";
+            break;
+      }
       write(fdpair[1], message, strlen(message));
       exit(1);
    }
    fcntl(fdpair[0], F_SETFL, O_NONBLOCK);
-   FILE* strace = fdopen(fdpair[0], "r");
+   FILE* trace = fdopen(fdpair[0], "r");
    Panel* panel = this->display;
-   int fd_strace = fileno(strace);
+   int fd_trace = fileno(trace);
    TraceScreen_draw(this);
    CRT_disableDelay();
    bool contLine = false;
@@ -90,13 +113,13 @@
    while (looping) {
       fd_set fds;
       FD_ZERO(&fds);
-      FD_SET(fd_strace, &fds);
+      FD_SET(fd_trace, &fds);
       struct timeval tv;
       tv.tv_sec = 0; tv.tv_usec = 500;
-      int ready = select(fd_strace+1, &fds, NULL, NULL, &tv);
+      int ready = select(fd_trace+1, &fds, NULL, NULL, &tv);
       int nread = 0;
       if (ready > 0)
-         nread = fread(buffer, 1, 1000, strace);
+         nread = fread(buffer, 1, 1000, trace);
       if (nread && this->tracing) {
          char* line = buffer;
          buffer[nread] = '\0';
@@ -171,6 +194,6 @@
    }
    kill(child, SIGTERM);
    waitpid(child, NULL, 0);
-   fclose(strace);
+   fclose(trace);
    CRT_enableDelay();
 }
Index: htop/TraceScreen.h
===================================================================
--- htop.orig/TraceScreen.h	2009-06-29 13:18:40.000000000 +0300
+++ htop/TraceScreen.h	2011-01-16 18:15:07.000000000 +0200
@@ -25,15 +25,21 @@
 #include "FunctionBar.h"
 
 
+typedef enum TraceType_ {
+   STRACE,
+   LTRACE
+} TraceType;
+
 typedef struct TraceScreen_ {
    Process* process;
    Panel* display;
    FunctionBar* bar;
    bool tracing;
+   TraceType type;
 } TraceScreen;
 
 
-TraceScreen* TraceScreen_new(Process* process);
+TraceScreen* TraceScreen_new(Process* process, TraceType type);
 
 void TraceScreen_delete(TraceScreen* this);
 
Index: htop/htop.1
===================================================================
--- htop.orig/htop.1.in	2011-01-16 17:02:59.000000000 +0200
+++ htop/htop.1.in	2011-01-16 18:15:07.000000000 +0200
@@ -54,6 +54,11 @@
 Display open files for a process: if lsof(1) is installed, pressing this key
 will display the list of file descriptors opened by the process.
 .TP
+.B L
+Trace process library calls: if ltrace(1) is installed, pressing this key
+will attach it to the currently selected process, presenting a live
+update of library calls issued by the process.
+.TP
 .B F1, h, ?
 Go to the help screen
 .TP
Index: htop/htop.c
===================================================================
--- htop.orig/htop.c	2011-01-16 17:02:59.000000000 +0200
+++ htop/htop.c	2011-01-16 18:15:07.000000000 +0200
@@ -133,6 +133,7 @@
    mvaddstr(19, 0, "   F2 S: setup                           F6 >: select sort column");
    mvaddstr(20, 0, "   F1 h: show this help screen              l: list open files with lsof");
    mvaddstr(21, 0, "  F10 q: quit                               s: trace syscalls with strace");
+   mvaddstr(22, 0, "                                            L: trace library calls with ltrace");
 
    attrset(CRT_colors[HELP_BOLD]);
    mvaddstr( 9, 0, " Arrows"); mvaddstr( 9,40, " F5 t");
@@ -152,10 +153,11 @@
    mvaddstr(19, 0, "   F2 S"); mvaddstr(19,40, " F6 >");
    mvaddstr(20, 0, " ? F1 h"); mvaddstr(20,40, "    l");
    mvaddstr(21, 0, "  F10 q"); mvaddstr(21,40, "    s");
+   mvaddstr(22,40, "    L");
    attrset(CRT_colors[DEFAULT_COLOR]);
 
    attrset(CRT_colors[HELP_BOLD]);
-   mvaddstr(23,0, "Press any key to return.");
+   mvaddstr(24,0, "Press any key to return.");
    attrset(CRT_colors[DEFAULT_COLOR]);
    refresh();
    CRT_readKey();
@@ -580,9 +582,20 @@
          Panel_onKey(panel, KEY_DOWN);
          break;
       }
+      case 'L':
+      {
+         TraceScreen* ts = TraceScreen_new((Process*) Panel_getSelected(panel), LTRACE);
+         TraceScreen_run(ts);
+         TraceScreen_delete(ts);
+         clear();
+         FunctionBar_draw(defaultBar, NULL);
+         refreshTimeout = 0;
+         CRT_enableDelay();
+         break;
+      }
       case 's':
       {
-         TraceScreen* ts = TraceScreen_new((Process*) Panel_getSelected(panel));
+         TraceScreen* ts = TraceScreen_new((Process*) Panel_getSelected(panel), STRACE);
          TraceScreen_run(ts);
          TraceScreen_delete(ts);
          clear();
