1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-22 05:48:01 +01:00
Files
wmaker/src/osdep_linux.c
Christophe CURIS 1c1909d5fe wmaker: took as much assignation as possible outside 'if' statements
It is generally considered bad practice to place an assignation inside the
expression for an "if" statement because it is often a source of bug,
because of possible typos and because it makes reviewing code more
complicated.

This patch fixes as much cases as possible to make the code easier to read.

Signed-off-by: Christophe CURIS <christophe.curis@free.fr>
2015-05-08 18:53:29 +01:00

85 lines
1.7 KiB
C

#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <WINGs/WUtil.h>
#include "wconfig.h"
#include "osdep.h"
/*
* copy argc and argv for an existing process identified by `pid'
* into suitable storage given in ***argv and *argc.
*
* subsequent calls use the same static area for argv and argc.
*
* returns 0 for failure, in which case argc := 0 and argv := NULL
* returns 1 for success
*/
Bool GetCommandForPid(int pid, char ***argv, int *argc)
{
static char buf[_POSIX_ARG_MAX];
int fd, i, j;
ssize_t count;
*argv = NULL;
*argc = 0;
/* cmdline is a flattened series of null-terminated strings */
snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
while (1) {
/* not switching this to stdio yet, as this does not need
* to be portable, and i'm lazy */
fd = open(buf, O_RDONLY);
if (fd != -1)
break;
if (errno == EINTR)
continue;
return False;
}
while (1) {
count = read(fd, buf, sizeof(buf));
if (count != -1)
break;
if (errno == EINTR)
continue;
close(fd);
return False;
}
close(fd);
/* count args */
for (i = 0; i < count; i++)
if (buf[i] == '\0')
(*argc)++;
if (*argc == 0)
return False;
*argv = (char **)wmalloc(sizeof(char *) * (*argc + 1 /* term. null ptr */));
(*argv)[0] = buf;
/* go through buf, set argv[$next] to the beginning of each string */
for (i = 0, j = 1; i < count; i++) {
if (buf[i] != '\0')
continue;
if (i < count - 1)
(*argv)[j++] = &buf[i + 1];
if (j == *argc)
break;
}
/* the list of arguments must be terminated by a null pointer */
(*argv)[j] = NULL;
return True;
}