113 lines
2 KiB
C
113 lines
2 KiB
C
// SPDX-License-Identifier: LGPL-2.1-only
|
|
// Copyright (c) 2015 - 2024 DisplayLink (UK) Ltd.
|
|
|
|
#include "evdi_lib.h"
|
|
#include <assert.h>
|
|
#include <dirent.h>
|
|
#include <errno.h>
|
|
#include <fcntl.h>
|
|
#include <poll.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/mman.h>
|
|
#include <sys/stat.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
|
|
const int command_length = 50;
|
|
const int name_length = 30;
|
|
|
|
static FILE *open_process_folder(const char *pid)
|
|
{
|
|
FILE *pf;
|
|
char command[command_length];
|
|
|
|
snprintf(command, command_length, "/proc/%s/stat", pid);
|
|
pf = fopen(command, "r");
|
|
|
|
return pf;
|
|
}
|
|
|
|
static void close_folder(FILE *pf)
|
|
{
|
|
if (fclose(pf) != 0)
|
|
exit(EXIT_FAILURE);
|
|
}
|
|
|
|
static char *process_name(FILE *pf)
|
|
{
|
|
int Xorg_name_len = 6;
|
|
char *name = (char *)malloc(Xorg_name_len * sizeof(char));
|
|
|
|
fscanf(pf, "%*s");
|
|
fscanf(pf, "%6s", name); // Xorg process had name (Xorg)
|
|
|
|
return name;
|
|
}
|
|
|
|
static bool is_name_Xorg(const char *name)
|
|
{
|
|
return strstr(name, "Xorg") != NULL;
|
|
}
|
|
|
|
static bool is_Xorg(const char *pid)
|
|
{
|
|
FILE *pf;
|
|
bool result;
|
|
char *name;
|
|
|
|
pf = open_process_folder(pid);
|
|
if (pf == NULL)
|
|
return false;
|
|
name = process_name(pf);
|
|
result = is_name_Xorg(name);
|
|
|
|
close_folder(pf);
|
|
free(name);
|
|
|
|
return result;
|
|
}
|
|
|
|
static bool is_numeric(const char *str)
|
|
{
|
|
return str[0] >= '0' && str[0] <= '9';
|
|
}
|
|
|
|
static bool is_Xorg_process_folder(const struct dirent *proc_entry)
|
|
{
|
|
const char *folder_name = proc_entry->d_name;
|
|
|
|
if (is_numeric(folder_name) && is_Xorg(folder_name))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
static bool iterate_through_all_process_folders_and_find_Xorg(void)
|
|
{
|
|
DIR *proc_dir;
|
|
const struct dirent *proc_entry;
|
|
bool result = false;
|
|
|
|
proc_dir = opendir("/proc");
|
|
if (proc_dir == NULL)
|
|
return false;
|
|
|
|
|
|
while ((proc_entry = readdir(proc_dir)) != NULL) {
|
|
if (is_Xorg_process_folder(proc_entry)) {
|
|
result = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
closedir(proc_dir);
|
|
return result;
|
|
}
|
|
|
|
bool Xorg_running(void)
|
|
{
|
|
return iterate_through_all_process_folders_and_find_Xorg();
|
|
}
|