#endif
#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
#include "xdbg.h"
#include "xdbg_types.h"
#include "xdbg_module.h"
+#include "xdbg_module_clist.h"
+static ModuleTraceClientOption*
+_findTraceClientOption (XDbgModule *pMod, char *client_name)
+{
+ int i = 0;
+
+ for (i = 0 ; i < pMod->trace_cnt ; i++)
+ {
+ ModuleTraceClientOption *option = &pMod->trace_options[i];
+ if (!strcmp(client_name, option->name))
+ {
+ return option;
+ }
+ }
+ return NULL;
+}
void
xDbgModuleCList (XDbgModule *pMod, char *reply, int *len)
info->index, info->pid, pClient->ignoreCount, info->command);
}
}
+
+
+void
+xDbgModuleClistTraceInit (XDbgModule *pMod)
+{
+ int i = 0;
+
+ for (i = 1 ; i < currentMaxClients ; i++)
+ {
+ ClientPtr pClient = clients[i];
+ ModuleClientInfo *info;
+
+ if (!pClient)
+ continue;
+
+ info = GetClientInfo (pClient);
+ xDbgModuleClistTraceAdd (pMod, info);
+ }
+}
+
+void
+xDbgModuleClistTraceAdd (XDbgModule *pMod, ModuleClientInfo *info)
+{
+ char *client_name = strrchr (info->command, '/');
+ ModuleTraceClient *trace_client = NULL;
+ ModuleTraceClient *client = NULL, *tmp = NULL;
+ ModuleTraceClientOption *option = NULL;
+
+ XDBG_DEBUG (MXDBG, "[TRACE_CLIENT] AddClist Trace command %s\n", info->command);
+
+ if (client_name)
+ client_name = client_name+1;
+ else
+ client_name = info->command;
+
+ if (!(option = _findTraceClientOption (pMod, client_name)))
+ return;
+
+ xorg_list_for_each_entry_safe(client, tmp, &pMod->trace_list, link) {
+ if (client->pid == info->pid)
+ {
+ XDBG_DEBUG (MXDBG, "[TRACE_CLIENT] Find Trace list:%s conn_cnt:%d+1\n", client_name, client->conn_cnt);
+ client->conn_cnt++;
+ return;
+ }
+ }
+
+ trace_client = (ModuleTraceClient *) calloc (1, sizeof(ModuleTraceClient));
+ XDBG_RETURN_IF_FAIL (trace_client != NULL);
+
+ trace_client->pid = info->pid;
+ trace_client->conn_cnt = 1;
+ strncpy (trace_client->name, client_name, strlen(client_name)+1);
+
+ XDBG_DEBUG (MXDBG, "[TRACE_CLIENT] Add Trace list:%s conn_cnt:%d\n", client_name, trace_client->conn_cnt);
+ xorg_list_add (&trace_client->link, &pMod->trace_list);
+
+ return;
+}
+
+void
+xDbgModuleClistTraceRemove (XDbgModule *pMod, ModuleClientInfo *info)
+{
+ char *client_name = strrchr (info->command, '/');
+ ModuleTraceClient *client = NULL, *tmp = NULL;
+ ModuleTraceClientOption *option = NULL;
+
+ XDBG_DEBUG (MXDBG, "[TRACE_CLIENT] RevmoeClist Trace command %s\n", info->command);
+
+ if (client_name)
+ client_name = client_name+1;
+ else
+ client_name = info->command;
+
+ if (!(option = _findTraceClientOption (pMod, client_name)))
+ return;
+
+ xorg_list_for_each_entry_safe(client, tmp, &pMod->trace_list, link) {
+ if (client->pid == info->pid)
+ {
+ if (client->conn_cnt == 1)
+ {
+ if (!strcmp(option->action, "cmd"))
+ {
+ int ret = 0;
+ ErrorF ("[TRACE_CLIENT] Disconnect Trace client:%s pid:%d cmd:%s", client->name, client->pid, option->cmd);
+ if (strstr(option->cmd, "reboot"))
+ sleep (1);
+
+ ret = system (option->cmd);
+ ErrorF (" ret:%d\n", ret);
+ }
+ else if (!strcmp(option->action, "error"))
+ {
+
+ FatalError ("[TRACE_CLIENT] %s\n", option->cmd);
+ ErrorF ("[TRACE_CLIENT] Disconnect Trace client:%s pid:%d msg:%s\n", client->name, client->pid, option->cmd);
+
+ }
+ else if (!strcmp(option->action, "log"))
+ {
+ ErrorF ("[TRACE_CLIENT] Disconnect Trace client:%s pid:%d msg:%s\n", client->name, client->pid, option->cmd);
+ }
+ else
+ {
+ XDBG_DEBUG (MXDBG, "[TRACE_CLIENT] Unkown action Trace client:%s pid:%d action:%s cmd:%s\n",
+ client->name, client->pid, option->action, option->cmd);
+ }
+
+ xorg_list_del (&client->link);
+ }
+ else
+ {
+ XDBG_DEBUG (MXDBG, "[TRACE_CLIENT] Unref client:%s conn_cnt:%d-1 \n", client_name, client->conn_cnt);
+ client->conn_cnt--;
+ }
+ return;
+ }
+ }
+ return;
+}