bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

rpctrace improvments


From: Alfred M. Szmidt
Subject: rpctrace improvments
Date: Thu, 16 Jun 2005 18:05:20 -0400

New (actually, just renamed) switch to rpctrace, now you can have all
your msgid files living in one directory, and don't have to bother
about thinking which one to include when having fun.

It has only been tested lightly.

Index: utils/ChangeLog
2005-06-16  Alfred M. Szmidt  <ams@gnu.org>

        * rpctrace.c: Include <fnmatch.h>, <sys/stat.h>, and <dirent.h>.
        (main, options): Renamed the option `-I' to `-i', and
        reimplemented `-I' to search a given directory for message ID
        files.
        (main): Variable `err' removed.

Index: utils/rpctrace.c
===================================================================
RCS file: /cvsroot/hurd/hurd/utils/rpctrace.c,v
retrieving revision 1.16
diff -p -u -u -r1.16 rpctrace.c
--- utils/rpctrace.c    1 Mar 2004 09:58:44 -0000       1.16
+++ utils/rpctrace.c    16 Jun 2005 22:00:41 -0000
@@ -1,6 +1,6 @@
 /* Trace RPCs sent to selected ports
 
-   Copyright (C) 1998,99,2001,02,03 Free Software Foundation, Inc.
+   Copyright (C) 1998,99,2001,02,03,05 Free Software Foundation, Inc.
 
    This file is part of the GNU Hurd.
 
@@ -25,6 +25,9 @@
 #include <mach/message.h>
 #include <assert.h>
 #include <fcntl.h>
+#include <fnmatch.h>
+#include <sys/stat.h>
+#include <dirent.h>
 #include <unistd.h>
 #include <argp.h>
 #include <error.h>
@@ -39,8 +42,10 @@ const char *argp_program_version = STAND
 static const struct argp_option options[] =
 {
   {"output", 'o', "FILE", 0, "Send trace output to FILE instead of stderr."},
-  {"rpc-list", 'I', "FILE", 0,
+  {"rpc-list", 'i', "FILE", 0,
    "Read FILE for assocations of message ID numbers to names."},
+  {0, 'I', "DIR", 0,
+   "Add the directory DIR to the list of directories to be searched for files 
containing message ID numbers."},
   {0}
 };
 
@@ -1059,7 +1064,6 @@ main (int argc, char **argv, char **envp
 {
   const char *outfile = 0;
   char **cmd_argv = 0;
-  error_t err;
 
   /* Parse our options...  */
   error_t parse_opt (int key, char *arg, struct argp_state *state)
@@ -1070,10 +1074,47 @@ main (int argc, char **argv, char **envp
          outfile = arg;
          break;
 
-       case 'I':
+       case 'i':
          parse_msgid_list (arg);
          break;
 
+       case 'I':
+         {
+           struct dirent **eps;
+           int n;
+           
+           static int
+             msgids_file_p (const struct dirent *eps)
+             {
+               if (fnmatch ("*.msgids", eps->d_name, 0) != FNM_NOMATCH)
+                 return 1;
+               return 0;
+             }
+           
+           n = scandir (arg, &eps, msgids_file_p, NULL);
+           if (n >= 0)
+             {
+               for (int cnt = 0; cnt < n; ++cnt)
+                 {
+                   char *msgids_file;
+                   struct stat st;
+                   if (asprintf (&msgids_file,
+                                 "%s/%s", arg, eps[cnt]->d_name) < 0)
+                     error (1, errno, "asprintf");
+                   /* We could use EPS[CNT]->d_type, but that
+                      information isn't trustworthy, so we do it the
+                      painful way. */
+                   if (stat (msgids_file, &st))
+                     error (1, errno, "stat");
+                   if (S_ISREG (st.st_mode))
+                     parse_msgid_list (msgids_file);
+                 }
+             }
+           /* If the directory couldn't be scaned for whatever
+              reason, just ignore it. */
+         }
+         break;
+
        case ARGP_KEY_NO_ARGS:
          argp_usage (state);
          return EINVAL;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]