diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-04-20 21:39:05 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-04-20 21:39:05 +0200 |
commit | d455e2a1292ee2c3577c7268796c7f596e2cc395 (patch) | |
tree | 552fe7160c4e50fae0a693c0fc2815158a4e5de5 | |
parent | create pid file and set environment (diff) | |
download | mds-d455e2a1292ee2c3577c7268796c7f596e2cc395.tar.gz mds-d455e2a1292ee2c3577c7268796c7f596e2cc395.tar.bz2 mds-d455e2a1292ee2c3577c7268796c7f596e2cc395.tar.xz |
m + reuse display indices
Signed-off-by: Mattias Andrée <maandree@operamail.com>
-rw-r--r-- | README | 5 | ||||
-rw-r--r-- | src/config.h | 10 | ||||
-rw-r--r-- | src/mds.c | 51 |
3 files changed, 63 insertions, 3 deletions
@@ -10,7 +10,10 @@ version of the display server you can start running the new version without having to restart the display server. Moreover, it allows you to replace components with your own versions or add new components, with exception of -parts that need the special privileges. +parts that need the special privileges and one special +component, the program that starts it all, but that file +will have no mission except restarting the master server +if it crashes once it has started the master server. Is this vaporware? Probably I often bored with graphical projects. Graphics sucks. diff --git a/src/config.h b/src/config.h index fc8bf75..551568c 100644 --- a/src/config.h +++ b/src/config.h @@ -20,10 +20,18 @@ /** + * The name under which this package is installed + */ +#ifndef PKGNAME +#define PKGNAME "mds" +#endif + + +/** * The root directory of all runtime data stored by MDS */ #ifndef MDS_RUNTIME_ROOT_DIRECTORY -#define MDS_RUNTIME_ROOT_DIRECTORY "/run/mds" +#define MDS_RUNTIME_ROOT_DIRECTORY "/run/" PKGNAME #endif @@ -91,10 +91,59 @@ int main(int argc_, const char** argv_) fd = open(pathname, O_CREAT | O_EXCL); if (fd == -1) { - /* TODO reuse display index not no longer used */ + /* Reuse display index not no longer used. */ + size_t read_len; + f = fopen(pathname, "r"); + if (f == NULL) /* Race, or error? */ + { + perror(*argv); + continue; + } + read_len = read(piddata, 1, sizeof(piddata) / sizeof(char), f); + if (ferror(f)) /* Failed to read. */ + perror(*argv); + else if (feof(f) == 0) /* Did not read everything. */ + fprintf(stderr, + "%s: the content of a PID file is longer than expected.\n", + *argv); + else + { + pid_t pid = 0; + size_t i, n = read_len - 1; + for (i = 0; i < n; i++) + { + char c = piddata[i]; + if (('0' <= c) && (c <= '9')) + pid = pid * 10 + (c & 15); + else + { + fprintf(stderr, + "%s: the content of a PID file is invalid.\n", + *argv); + goto bad; + } + } + if (piddata[n] != '\n') + { + fprintf(stderr, + "%s: the content of a PID file is invalid.\n", + *argv); + goto bad; + } + if (kill(pid, 0) < 0) /* Check if the PID is still allocated to any process. */ + if (errno == ESRCH) /* PID is not used. */ + { + fclose(f); + close(fd); + break; + } + } + bad: + fclose(f); continue; } close(fd); + break; } if (display == DISPLAY_MAX) { |