Re: Xid - Pid establishment

Carsten Haitzler (The Rasterman) <[email protected]>
Newsgroups gmane.comp.xfree86.devel
Organization You expect me to be organized?
Message-ID <20050212202059.678d37ba@icky>
On Sat, 12 Feb 2005 16:17:33 +0530 Kala B <[email protected]> babbled:

> Hi,
> 
> I am trying to develop an application, which needs to know the owner (
> process id )  of every window that is being created on the system. As,
> setting of _NET_WM_PID is not mandated for applications, is there some
> other way through which I could get to know the pid of a window?
> 
> I am only interested in the scenario, when both the xserver and
> xclient are on the same machine, so the XServer uses a Unix domain
> socket. So, in this case, the XServer would anyway get to know the pid
> of the connecting client by using the SO_PEERCRED option. Can the
> xserver propagate the pid of the client ? (Probably by adding another
> specific property to every window being created?). Would there be any
> issues with this approach.
> 
> These are my very very initial thoughts and am also new to X, so
> request you all to give me your suggestions.

see attached source and Makefile.am - use it as an LD_PRELOAD (i did this a long
time ago) and then u guarantee properties on everything you run with the
LD_PRELOAD active.

> Thanks a lot
> Kala
> _______________________________________________
> Devel mailing list
> [email protected]
> http://XFree86.Org/mailman/listinfo/devel
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [email protected]
裸好多                              [email protected]
Tokyo, Japan (東京 日本)
e_hack.c (text/x-csrc, 6.3 KB)
#include "config.h"
#include "e_hack.h"

/* prototypes */
static void __e_hack_set_properties(Display *display, Window window);

/* dlopened xlib so we can find the symbols in the real xlib to call them */
static void *lib_xlib = NULL;

/* the function that actually sets the properties on toplevel window */
static void
__e_hack_set_properties(Display *display, Window window)
{
   static Atom a_launch_id = 0;
   static Atom a_launch_path = 0;
   static Atom a_user_id = 0;
   static Atom a_process_id = 0;
   static Atom a_p_process_id = 0;
   static Atom a_machine_name = 0;
   static Atom a_user_name = 0;
   char *env = NULL;

   if (!a_launch_id)    a_launch_id    = XInternAtom(display, "_E_HACK_LAUNCH_ID", False);
   if (!a_launch_path)  a_launch_path  = XInternAtom(display, "_E_HACK_LAUNCH_PATH", False);
   if (!a_user_id)      a_user_id      = XInternAtom(display, "_E_HACK_USER_ID", False);
   if (!a_process_id)   a_process_id   = XInternAtom(display, "_E_HACK_PROCESS_ID", False);
   if (!a_p_process_id) a_p_process_id = XInternAtom(display, "_E_HACK_PARENT_PROCESS_ID", False);
   if (!a_machine_name) a_machine_name = XInternAtom(display, "_E_HACK_MACHINE_NAME", False);
   if (!a_user_name)    a_user_name    = XInternAtom(display, "_E_HACK_USER_NAME", False);

   if ((env = getenv("E_HACK_LAUNCH_ID")))
      XChangeProperty(display, window, a_launch_id, XA_STRING, 8, PropModeReplace, env, strlen(env));
   if ((env = getenv("E_HACK_LAUNCH_PATH")))
      XChangeProperty(display, window, a_launch_path, XA_STRING, 8, PropModeReplace, env, strlen(env));
     {
	uid_t uid;
	pid_t pid, ppid;
	struct utsname ubuf;
	char buf[4096];
	
	uid = getuid();
	pid = getpid();
	ppid = getppid();

	snprintf(buf, sizeof(buf), "%i", uid);
	XChangeProperty(display, window, a_user_id, XA_STRING, 8, PropModeReplace, buf, strlen(buf));
	snprintf(buf, sizeof(buf), "%i", pid);
	XChangeProperty(display, window, a_process_id, XA_STRING, 8, PropModeReplace, buf, strlen(buf));
	snprintf(buf, sizeof(buf), "%i", ppid);
	XChangeProperty(display, window, a_p_process_id, XA_STRING, 8, PropModeReplace, buf, strlen(buf));
	if (!uname(&ubuf))
	  {
	     snprintf(buf, sizeof(buf), "%s", ubuf.nodename);
	     XChangeProperty(display, window, a_machine_name, XA_STRING, 8, PropModeReplace, buf, strlen(buf));
	  }
	else
	   XChangeProperty(display, window, a_machine_name, XA_STRING, 8, PropModeReplace, " ", 1);
     }
   if ((env = getenv("USER")))
      XChangeProperty(display, window, a_user_name, XA_STRING, 8, PropModeReplace, env, strlen(env));
}

/* XCreateWindow intercept hack */
Window
XCreateWindow(
	      Display *display,
	      Window parent,
	      int x, int y,
	      unsigned int width, unsigned int height,
	      unsigned int border_width,
	      int depth,
	      unsigned int class,
	      Visual *visual,
	      unsigned long valuemask,
	      XSetWindowAttributes *attributes
	      )
{
   static Window (*func)
      (
       Display *display,
       Window parent,
       int x, int y,
       unsigned int width, unsigned int height,
       unsigned int border_width,
       int depth,
       unsigned int class,
       Visual *visual,
       unsigned long valuemask,
       XSetWindowAttributes *attributes
       ) = NULL;
   int i;

   /* find the real Xlib and the real X function */
   if (!lib_xlib) lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY);
   if (!func) func = dlsym (lib_xlib, "XCreateWindow");

   /* multihead screen handling loop */
   for (i = 0; i < ScreenCount(display); i++)
     {
	/* if the window is created as a toplevel window */
	if (parent == RootWindow(display, i))
	  {
	     Window window;
	     
	     /* create it */
	     window = (*func) (display, parent, x, y, width, height, 
				border_width, depth, class, visual, valuemask, 
				attributes);
	     /* set properties */
	     __e_hack_set_properties(display, window);
	     /* return it */
	     return window;
	  }
     }
   /* normal child window - create as usual */
   return (*func) (display, parent, x, y, width, height, border_width, depth,
		   class, visual, valuemask, attributes);
}

/* XCreateSimpleWindow intercept hack */
Window
XCreateSimpleWindow(
		    Display *display,
		    Window parent,
		    int x, int y,
		    unsigned int width, unsigned int height,
		    unsigned int border_width,
		    unsigned long border,
		    unsigned long background
		    )
{
   static Window (*func)
      (
       Display *display,
       Window parent,
       int x, int y,
       unsigned int width, unsigned int height,
       unsigned int border_width,
       unsigned long border,
       unsigned long background
       ) = NULL;
   int i;
   
   /* find the real Xlib and the real X function */
   if (!lib_xlib) lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY);
   if (!func) func = dlsym (lib_xlib, "XCreateSimpleWindow");
   
   /* multihead screen handling loop */
   for (i = 0; i < ScreenCount(display); i++)
     {
	/* if the window is created as a toplevel window */
	if (parent == RootWindow(display, i))
	  {
	     Window window;
	     
	     /* create it */
	     window = (*func) (display, parent, x, y, width, height, 
				border_width, border, background);
	     /* set properties */
	     __e_hack_set_properties(display, window);
	     /* return it */
	     return window;
	  }
     }
   /* normal child window - create as usual */
   return (*func) (display, parent, x, y, width, height, 
		   border_width, border, background);
}

/* XReparentWindow intercept hack */
int
XReparentWindow(
		Display *display,
		Window window,
		Window parent,
		int x, int y
		)
{
   static int (*func)
      (
       Display *display,
       Window window,
       Window parent,
       int x, int y
       ) = NULL;
   int i;
   
   /* find the real Xlib and the real X function */
   if (!lib_xlib) lib_xlib = dlopen("libX11.so", RTLD_GLOBAL | RTLD_LAZY);
   if (!func) func = dlsym (lib_xlib, "XReparentWindow");
   
   /* multihead screen handling loop */
   for (i = 0; i < ScreenCount(display); i++)
     {
	/* if the window is created as a toplevel window */
	if (parent == RootWindow(display, i))
	  {
	     /* set properties */
	     __e_hack_set_properties(display, window);
	     /* reparent it */
	     return (*func) (display, window, parent, x, y);
	  }
     }
   /* normal child window reparenting - reparent as usual */
   return (*func) (display, window, parent, x, y);
}
e_hack.h (text/x-chdr, 252 B)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <dlfcn.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/utsname.h>
#include <X11/Xlib.h>
#include <X11/X.h>
#include <X11/Xatom.h>
Makefile.am (application/octet-stream, 604 B) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.