This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add pldd(1)


The pldd(1) command apparently originates from Solaris and was added to
glibc-2.15[1].  Patches and new file attached.


Yaakov

[1] http://sourceware.org/git/?p=glibc.git;a=blob_plain;f=NEWS
/* pldd.cc

   Copyright 2012 Red Hat, Inc.

This file is part of Cygwin.

This software is a copyrighted work licensed under the terms of the
Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
details. */

#define WIN32_LEAN_AND_MEAN
#define UNICODE
#include <errno.h>
#include <error.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/cygwin.h>
#include <cygwin/version.h>
#include <windows.h>
#include <psapi.h>

struct option longopts[] =
{
  {"help", no_argument, NULL, '?'},
  {"version", no_argument, NULL, 'V'},
  {"usage", no_argument, NULL, 0},
  {0, no_argument, NULL, 0}
};
const char *opts = "?V";

__attribute__((noreturn))
static void
print_help (void)
{
  printf ("Usage: pldd [OPTION...] PID\n\n"
          "List dynamic shared objects loaded into a process.\n\n"
          "  -?, --help                 Give this help list\n"
          "      --usage                Give a short usage message\n"
          "  -V, --version              Print program version\n");
  exit (EXIT_SUCCESS);
}

__attribute__((noreturn))
static void
print_usage (void)
{
  printf ("Usage: pldd [-?V] [--help] [--usage] [--version] PID\n");
  exit (EXIT_SUCCESS);
}

__attribute__((noreturn))
static void
print_version ()
{
  printf ("pldd (cygwin) %d.%d.%d\n"
	  "List dynamic shared objects loaded into process.\n"
	  "Copyright (C) 2012 Red Hat, Inc.\n\n"
	  "This program comes with NO WARRANTY, to the extent permitted by law.\n"
	  "You may redistribute copies of this program under the terms of\n"
	  "the Cygwin license. Please consult the CYGWIN_LICENSE file for details.\n",
	  CYGWIN_VERSION_DLL_MAJOR / 1000,
	  CYGWIN_VERSION_DLL_MAJOR % 1000,
	  CYGWIN_VERSION_DLL_MINOR);
  exit (EXIT_SUCCESS);
}

__attribute__((noreturn))
static void
print_nargs (void)
{
  fprintf (stderr, "Exactly one parameter with process ID required.\n"
                   "Try `pldd --help' or `pldd --usage' for more information.\n");
  exit (EXIT_FAILURE);
}

int
main (int argc, char *argv[])
{
  int optch, pid, winpid, i;
  char *pidfile, *exefile, *exename;
  FILE *fd;
  HANDLE hProcess;
  HMODULE hModules[1024];
  DWORD cbModules;

  while ((optch = getopt_long (argc, argv, opts, longopts, &optind)) != -1)
    switch (optch)
      {
      case '?':
        print_help ();
        break;
      case 'V':
        print_version ();
        break;
      case 0:
        if (strcmp( "usage", longopts[optind].name ) == 0)
          print_usage ();
        break;
      default:
        break;
      }

  argc -= optind;
  argv += optind;
  if (argc != 1)
    print_nargs ();

  pid = atoi (argv[0]);

  if ((pid == 0))
    error (1, 0, "invalid process ID '%s'", argv[0]);

  pidfile = (char *) malloc (32);
  sprintf(pidfile, "/proc/%d/winpid", pid);
  fd = fopen (pidfile, "rb");
  if (!fd)
    error (1, ENOENT, "cannot open /proc/%d", pid);
  fscanf (fd, "%d", &winpid);

  exefile = (char *) malloc (32);
  exename = (char *) malloc (MAX_PATH);
  sprintf(exefile, "/proc/%d/exename", pid);
  fd = fopen (exefile, "rb");
  fscanf (fd, "%s", exename);

  hProcess = OpenProcess (PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, winpid);
  if (!hProcess)
    error (1, EPERM, "cannot attach to process %d", pid);

  printf ("%d:\t%s\n", pid, exename);

  EnumProcessModules (hProcess, hModules, sizeof(hModules), &cbModules);
  /* start at 1 to skip the executable itself */
  for (i = 1; i < (cbModules / sizeof(HMODULE)); i++)
    {
      TCHAR winname[MAX_PATH];
      char posixname[MAX_PATH];
      GetModuleFileNameEx (hProcess, hModules[i], winname, MAX_PATH);
      cygwin_conv_path (CCP_WIN_W_TO_POSIX, winname, posixname, MAX_PATH);
      printf ("%s\n", posixname);
    }

  return 0;
}
2012-02-??  Yaakov Selkowitz  <yselkowitz@...>

	* Makefile.in (CYGWIN_BINS): Add pldd.
	(pldd.exe): Add -lpsapi to ALL_LDFLAGS.
	* pldd.c: New file.
	* utils.sgml (pldd): New section.

Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/winsup/utils/Makefile.in,v
retrieving revision 1.98
diff -u -p -r1.98 Makefile.in
--- Makefile.in	29 Jan 2012 09:41:06 -0000	1.98
+++ Makefile.in	24 Feb 2012 07:44:28 -0000
@@ -53,7 +53,7 @@ MINGW_CXX        := ${srcdir}/mingw ${CX
 # List all binaries to be linked in Cygwin mode.  Each binary on this list
 # must have a corresponding .o of the same name.
 CYGWIN_BINS := ${addsuffix .exe,cygpath getconf getfacl ldd locale kill mkgroup \
-        mkpasswd mount passwd ps regtool setfacl setmetamode ssp tzset umount}
+        mkpasswd mount passwd pldd ps regtool setfacl setmetamode ssp tzset umount}
 
 # List all binaries to be linked in MinGW mode.  Each binary on this list
 # must have a corresponding .o of the same name.
@@ -81,6 +81,7 @@ ps.exe: ALL_LDFLAGS += -lcygwin -lpsapi 
 strace.exe: MINGW_LDFLAGS += -lntdll
 
 ldd.exe: ALL_LDFLAGS += -lpsapi
+pldd.exe: ALL_LDFLAGS += -lpsapi
 
 ldh.exe: MINGW_LDLIBS :=
 ldh.exe: MINGW_LDFLAGS := -nostdlib -lkernel32
Index: utils.sgml
===================================================================
RCS file: /cvs/src/src/winsup/utils/utils.sgml,v
retrieving revision 1.99
diff -u -p -r1.99 utils.sgml
--- utils.sgml	4 Feb 2012 11:42:04 -0000	1.99
+++ utils.sgml	24 Feb 2012 07:44:28 -0000
@@ -1434,6 +1434,23 @@ some systems.</para>
 
 </sect2>
 
+<sect2 id="pldd"><title>pldd</title>
+
+<screen>
+Usage: pldd [OPTION...] PID
+
+List dynamic shared objects loaded into a process.
+
+  -?, --help                 Give this help list
+      --usage                Give a short usage message
+  -V, --version              Print program version
+</screen>
+
+<para><command>pldd</command> prints the shared libraries (DLLs) loaded
+by the process with the given PID.</para>
+
+</sect2>
+
 <sect2 id="ps"><title>ps</title>
 
 <screen>
2012-02-??  Yaakov Selkowitz  <yselkowitz@...>

	* new-features.sgml (ov-new1.7.11): Document pldd.


Index: new-features.sgml
===================================================================
RCS file: /cvs/src/src/winsup/doc/new-features.sgml,v
retrieving revision 1.102
diff -u -p -r1.102 new-features.sgml
--- new-features.sgml	22 Feb 2012 02:06:15 -0000	1.102
+++ new-features.sgml	24 Feb 2012 08:27:09 -0000
@@ -5,6 +5,10 @@
 <itemizedlist mark="bullet">
 
 <listitem><para>
+New <command>pldd</command> command for listing DLLs loaded by a process.
+</para></listitem>
+
+<listitem><para>
 New API: pthread_getname_np, pthread_setname_np, scandirat.
 </para></listitem>
 

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]