[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;
- rpctrace improvments,
Alfred M. Szmidt <=