#include "DSWaylandProtocolTrace.h"
#include "DSWaylandProtocolTracePrivate.h"
+#include "DSWaylandClient.h"
#include <fcntl.h>
#include <unistd.h>
return rulechecker_rule_validate(rc, log->type, log->target_id, log->name, log->client_pid, cmd);
}
+void DSWaylandProtocolTracePrivate::wl_client_proc_name_get(pid_t pid, char *name, int size)
+ {
+ if(!name) return;
+
+ FILE *h;
+ char proc[512], pname[512];
+ size_t len;
+
+ snprintf(proc, 512, "/proc/%d/cmdline", pid);
+
+ h = fopen(proc, "r");
+ if(!h) return;
+
+ len = fread(pname, sizeof(char), 512, h);
+ if(len >0)
+ pname[len-1]='\0';
+ else
+ {
+ strncpy(pname, "NO NAME", sizeof(pname));
+ }
+ fclose(h);
+
+ strncpy(name, pname, size);
+}
+
void DSWaylandProtocolTracePrivate::protocol_trace_set(void)
{
DSLOG_DBG("DSWaylandProtocolTracePriv","IN >> protocol trace set");
DSLOG_DBG("DSWaylandProtocolTracePriv","get display ");
//check working
- ds_wl_protocol_logger = wl_display_add_protocol_logger(display, protocol_trace_func, nullptr);
+ ds_wl_protocol_logger = wl_display_add_protocol_logger(display, protocol_trace_func, __wlCompositor);
DSLOG_DBG("DSWaylandProtocolTracePriv","OUT << protocol trace set");
}
elog.target_id = wl_resource_get_id(message->resource);
snprintf(elog.name, PATH_MAX,"%s:%s", wl_resource_get_class(message->resource), message->message->name);
+ DSWaylandCompositor * comp = (DSWaylandCompositor * )user_data;
+ std::list<DSWaylandClient *> clients = comp->clients();
+ for(auto client : clients)
+ {
+ char name[512];
+ wl_client_proc_name_get(client->pid(), name, sizeof(name));
+ if(client->pid() == client_pid)
+ {
+ snprintf(elog.cmd, PATH_MAX, "%s", name);
+ }
+ }
+
if(!protocol_rule_validate(&elog)) return;
BUF_SNPRINTF("[%10.3f] %s%d%s%s@%u.%s(",
{
char iface[64] = {0,};
char *msg = nullptr;
- int colon = atoi(":");
if(args->name)
- msg = (char *) index(args->name, colon);
+ {
+ msg = (char *) strchr(args->name, ':');
+ }
if(msg)
{
int min = MIN(sizeof(iface)-1, msg-args->name);
}
else if(!strcasecmp(data->variable_name, "IFACE"))
{
- if(msg && !iface[0] && rulechecker_string_compare(data->comparer, data->value.string, iface))
+ if(msg && iface[0] && rulechecker_string_compare(data->comparer, data->value.string, iface))
data->result = PROTOCOLTRACE_RESULT_TRUE;
else
data->result = PROTOCOLTRACE_RESULT_FALSE;