Commit 239fe3d0 authored by Rami Ylimäki's avatar Rami Ylimäki Committed by Mike Gabriel

os: Add facilities for client ID tracking.

commit 6d6d4cb6043905d850834946e9bfc526ed5a9ef7 Author: Matthieu Herrb <matthieu.herrb@laas.fr> Date: Mon Jan 2 13:23:59 2012 +0000 Add OpenBSD support to DetermineClientCmd() Uses kvm_getargv() from libkvm. Signed-off-by: 's avatarMatthieu Herrb <matthieu.herrb@laas.fr> Reviewed-by: 's avatarAdam Jackson <ajax@redhat.com> Signed-off-by: 's avatarKeith Packard <keithp@keithp.com> commit cfc4c3d7fa8bd4da4c08b2ab8e6f85435f75353a Author: Alan Coopersmith <alan.coopersmith@oracle.com> Date: Sat Dec 24 10:00:56 2011 -0800 Add Solaris support to DetermineClientCmd Uses /proc/pid/psinfo to read command & partial arguments. Moves cmdsize & argsize variables into non-Solaris #else clause to avoid unused variable warnings. Fixes format mismatch errors when building with DEBUG defined on a 64-bit platform (where Mask is defined as CARD32). Signed-off-by: 's avatarAlan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: 's avatarRami Ylimäki <rami.ylimaki@vincit.fi> Signed-off-by: 's avatarKeith Packard <keithp@keithp.com> commit 780133f9ae7fada462714b47e79d26075bbd9abe Author: Alan Coopersmith <alan.coopersmith@oracle.com> Date: Fri Oct 28 21:29:50 2011 -0700 Convert DetermineClientCmd to use strdup instead of malloc+strncpy *cmdname is initialized to NULL earlier in the function, so it's okay to overwrite it with NULL if strdup fails, don't need that extra check. Signed-off-by: 's avatarAlan Coopersmith <alan.coopersmith@oracle.com> Reviewed-by: 's avatarJeremy Huddleston <jeremyhu@apple.com> commit 2ef4ff45ef1fcfc4967ebe3d550408769e5f6500 Author: Erkki Seppälä <erkki.seppala@vincit.fi> Date: Fri Mar 25 10:38:23 2011 +0200 os/client: Prevent rare fd leak in DetermineClientPid DetermineClientPid didn't close file descriptor if read on /proc/pid/cmdline failed. Adjusted the code to disregard the close return value and perform the return after that, if the read failed or returned EOF. Signed-off-by: 's avatarMark Kettenis <mark.kettenis@xs4all.nl> Signed-off-by: 's avatarErkki Seppälä <erkki.seppala@vincit.fi> Reviewed-by: 's avatarRami Ylimäki <rami.ylimaki@vincit.fi> Signed-off-by: 's avatarKeith Packard <keithp@keithp.com> commit 1e933665bef26c74196bb7c59910e6a78bcacf0e Author: Rami Ylimäki <rami.ylimaki@vincit.fi> Date: Wed Dec 22 16:51:09 2010 +0200 os: Add facilities for client ID tracking. An interface is provided for figuring out the PID and process name of a client. Make some existing functionality from SELinux and IA extensions available for general use. Signed-off-by: 's avatarRami Ylimäki <rami.ylimaki@vincit.fi> Reviewed-by: 's avatarTiago Vignatti <tiago.vignatti@nokia.com> Backported-to-NX-by: 's avatarMike Gabriel <mike.gabriel@das-netzwerkteam.de>
parent 366067b7
...@@ -323,6 +323,15 @@ NXAGENTNXLIBS = -L../../../nxcomp \ ...@@ -323,6 +323,15 @@ NXAGENTNXLIBS = -L../../../nxcomp \
-lXcompshad \ -lXcompshad \
-lXrender -lXfixes -lXfont -lXcomposite -lXdmcp \ -lXrender -lXfixes -lXfont -lXcomposite -lXdmcp \
-lNX_X11 -lXext -lNX_X11 -lXext
#elif defined(OpenBSDArchitecture)
NXAGENTNXLIBS = -L../../../nxcomp \
-L../../../nx-X11/exports/lib \
-L../../../nxcompshad \
-lkvm \
-lXcomp \
-lXcompshad \
-lXrender -lXfixes -lXfont -lXcomposite -lXinerama -lXdmcp \
-lNX_X11 -lXext
#else #else
NXAGENTNXLIBS = -L../../../nxcomp \ NXAGENTNXLIBS = -L../../../nxcomp \
-L../../../nx-X11/exports/lib \ -L../../../nx-X11/exports/lib \
......
...@@ -112,6 +112,7 @@ int ProcInitialConnection(); ...@@ -112,6 +112,7 @@ int ProcInitialConnection();
#include "inputstr.h" #include "inputstr.h"
#include "xkbsrv.h" #include "xkbsrv.h"
#endif #endif
#include "client.h"
#define mskcnt ((MAXCLIENTS + 31) / 32) #define mskcnt ((MAXCLIENTS + 31) / 32)
#define BITMASK(i) (1U << ((i) & 31)) #define BITMASK(i) (1U << ((i) & 31))
...@@ -3560,6 +3561,9 @@ CloseDownClient(register ClientPtr client) ...@@ -3560,6 +3561,9 @@ CloseDownClient(register ClientPtr client)
CallCallbacks((&ClientStateCallback), (void *)&clientinfo); CallCallbacks((&ClientStateCallback), (void *)&clientinfo);
} }
FreeClientResources(client); FreeClientResources(client);
/* Disable client ID tracking. This must be done after
* ClientStateCallback. */
ReleaseClientIds(client);
if (client->index < nextFreeClientID) if (client->index < nextFreeClientID)
nextFreeClientID = client->index; nextFreeClientID = client->index;
clients[client->index] = NullClient; clients[client->index] = NullClient;
...@@ -3643,6 +3647,7 @@ void InitClient(ClientPtr client, int i, void * ospriv) ...@@ -3643,6 +3647,7 @@ void InitClient(ClientPtr client, int i, void * ospriv)
client->smart_start_tick = SmartScheduleTime; client->smart_start_tick = SmartScheduleTime;
client->smart_stop_tick = SmartScheduleTime; client->smart_stop_tick = SmartScheduleTime;
client->smart_check_tick = SmartScheduleTime; client->smart_check_tick = SmartScheduleTime;
client->clientIds = NULL;
} }
extern int clientPrivateLen; extern int clientPrivateLen;
...@@ -3724,6 +3729,11 @@ ClientPtr NextAvailableClient(void * ospriv) ...@@ -3724,6 +3729,11 @@ ClientPtr NextAvailableClient(void * ospriv)
currentMaxClients++; currentMaxClients++;
while ((nextFreeClientID < MAXCLIENTS) && clients[nextFreeClientID]) while ((nextFreeClientID < MAXCLIENTS) && clients[nextFreeClientID])
nextFreeClientID++; nextFreeClientID++;
/* Enable client ID tracking. This must be done before
* ClientStateCallback. */
ReserveClientIds(client);
if (ClientStateCallback) if (ClientStateCallback)
{ {
NewClientInfoRec clientinfo; NewClientInfoRec clientinfo;
......
...@@ -100,6 +100,7 @@ Equipment Corporation. ...@@ -100,6 +100,7 @@ Equipment Corporation.
#include "site.h" #include "site.h"
#include "dixfont.h" #include "dixfont.h"
#include "extnsionst.h" #include "extnsionst.h"
#include "client.h"
#ifdef PANORAMIX #ifdef PANORAMIX
#include "panoramiXsrv.h" #include "panoramiXsrv.h"
#else #else
...@@ -382,6 +383,7 @@ main(int argc, char *argv[], char *envp[]) ...@@ -382,6 +383,7 @@ main(int argc, char *argv[], char *envp[])
InitInput(argc, argv); InitInput(argc, argv);
if (InitAndStartDevices() != Success) if (InitAndStartDevices() != Success)
FatalError("failed to initialize core devices"); FatalError("failed to initialize core devices");
ReserveClientIds(serverClient);
InitFonts(); InitFonts();
if (loadableFonts) { if (loadableFonts) {
...@@ -470,6 +472,7 @@ main(int argc, char *argv[], char *envp[]) ...@@ -470,6 +472,7 @@ main(int argc, char *argv[], char *envp[])
#endif #endif
FreeAuditTimer(); FreeAuditTimer();
ReleaseClientIds(serverClient);
free(serverClient->devPrivates); free(serverClient->devPrivates);
serverClient->devPrivates = NULL; serverClient->devPrivates = NULL;
......
...@@ -16,6 +16,7 @@ depend:: ...@@ -16,6 +16,7 @@ depend::
InstallDriverSDKNonExecFile(XIstubs.h,$(DRIVERSDKINCLUDEDIR)) InstallDriverSDKNonExecFile(XIstubs.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(bstore.h,$(DRIVERSDKINCLUDEDIR)) InstallDriverSDKNonExecFile(bstore.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(bstorestr.h,$(DRIVERSDKINCLUDEDIR)) InstallDriverSDKNonExecFile(bstorestr.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(client.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(colormap.h,$(DRIVERSDKINCLUDEDIR)) InstallDriverSDKNonExecFile(colormap.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(colormapst.h,$(DRIVERSDKINCLUDEDIR)) InstallDriverSDKNonExecFile(colormapst.h,$(DRIVERSDKINCLUDEDIR))
InstallDriverSDKNonExecFile(cursor.h,$(DRIVERSDKINCLUDEDIR)) InstallDriverSDKNonExecFile(cursor.h,$(DRIVERSDKINCLUDEDIR))
......
/*
* Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). All
* rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/* Author: Rami Ylimäki <rami.ylimaki@vincit.fi> */
#ifndef CLIENT_H
#define CLIENT_H
#ifdef HAVE_DIX_CONFIG_H
#include <dix-config.h>
#endif /* HAVE_DIX_CONFIG_H */
#include <X11/Xfuncproto.h>
#include <sys/types.h>
/* Client IDs. Use GetClientPid, GetClientCmdName and GetClientCmdArgs
* instead of accessing the fields directly. */
typedef struct {
pid_t pid; /* process ID, -1 if not available */
const char *cmdname; /* process name, NULL if not available */
const char *cmdargs; /* process arguments, NULL if not available */
} ClientIdRec, *ClientIdPtr;
struct _Client;
/* Initialize and clean up. */
void ReserveClientIds(struct _Client *client);
void ReleaseClientIds(struct _Client *client);
/* Determine client IDs for caching. Exported on purpose for
* extensions such as SELinux. */
extern _X_EXPORT pid_t DetermineClientPid(struct _Client *client);
extern _X_EXPORT void DetermineClientCmd(pid_t, const char **cmdname,
const char **cmdargs);
/* Query cached client IDs. Exported on purpose for drivers. */
extern _X_EXPORT pid_t GetClientPid(struct _Client *client);
extern _X_EXPORT const char *GetClientCmdName(struct _Client *client);
extern _X_EXPORT const char *GetClientCmdArgs(struct _Client *client);
#endif /* CLIENT_H */
...@@ -24,6 +24,7 @@ SOFTWARE. ...@@ -24,6 +24,7 @@ SOFTWARE.
#ifndef DIXSTRUCT_H #ifndef DIXSTRUCT_H
#define DIXSTRUCT_H #define DIXSTRUCT_H
#include "client.h"
#include "dix.h" #include "dix.h"
#include "resource.h" #include "resource.h"
#include "cursor.h" #include "cursor.h"
...@@ -141,6 +142,8 @@ typedef struct _Client { ...@@ -141,6 +142,8 @@ typedef struct _Client {
long smart_start_tick; long smart_start_tick;
long smart_stop_tick; long smart_stop_tick;
long smart_check_tick; long smart_check_tick;
ClientIdPtr clientIds;
} ClientRec; } ClientRec;
/* /*
......
...@@ -128,6 +128,7 @@ TMEMCMP_OBJS = timingsafe_memcmp.o ...@@ -128,6 +128,7 @@ TMEMCMP_OBJS = timingsafe_memcmp.o
BOOTSTRAPCFLAGS = BOOTSTRAPCFLAGS =
SRCS = WaitFor.c \ SRCS = WaitFor.c \
access.c \ access.c \
client.c \
connection.c \ connection.c \
io.c \ io.c \
$(COLOR_SRCS) \ $(COLOR_SRCS) \
...@@ -151,6 +152,7 @@ BOOTSTRAPCFLAGS = ...@@ -151,6 +152,7 @@ BOOTSTRAPCFLAGS =
OBJS = WaitFor.o \ OBJS = WaitFor.o \
access.o \ access.o \
client.o \
connection.o \ connection.o \
io.o \ io.o \
$(COLOR_OBJS) \ $(COLOR_OBJS) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment