diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-04-20 11:34:14 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-04-20 11:34:14 +0200 |
commit | b8664df21ca291248c15ba5da7641084fadc40ef (patch) | |
tree | 9b18c296d36042ea7e5dd47a5d819dc515554de0 /src | |
parent | add readme (diff) | |
download | mds-b8664df21ca291248c15ba5da7641084fadc40ef.tar.gz mds-b8664df21ca291248c15ba5da7641084fadc40ef.tar.bz2 mds-b8664df21ca291248c15ba5da7641084fadc40ef.tar.xz |
not too much...
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/config.h | 39 | ||||
-rw-r--r-- | src/mds.c | 89 |
2 files changed, 128 insertions, 0 deletions
diff --git a/src/config.h b/src/config.h new file mode 100644 index 0000000..e3a8bb0 --- /dev/null +++ b/src/config.h @@ -0,0 +1,39 @@ +/** + * mds — A micro-display server + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#ifndef MDS_CONFIG_H +#define MDS_CONFIG_H + + +/** + * The root directory of all runtime data stored by MDS + */ +#ifndef MDS_RUNTIME_ROOT_DIRECTORY +#define MDS_RUNTIME_ROOT_DIRECTORY "/run/mds" +#endif + + +/** + * The user ID for the root user + */ +#ifndef ROOT_USER_UID +#define ROOT_USER_UID 0 +#endif + + +#endif + diff --git a/src/mds.c b/src/mds.c new file mode 100644 index 0000000..07041fc --- /dev/null +++ b/src/mds.c @@ -0,0 +1,89 @@ +/** + * mds — A micro-display server + * Copyright © 2014 Mattias Andrée (maandree@member.fsf.org) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +#include "config.h" + +#include <sys/stat.h> +#include <sys/types.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> + + +/** + * Entry point of the program + * + * @param argc Number of elements in `argv` + * @param argv Command line arguments + * @return Non-zero on error + */ +int main(int argc, const char** argv) +{ + struct stat attr; + + (void) argv; + + /* Sanity check the number of command line arguments. */ + if (argc > 50) + { + fprintf(stderr, + "%s: that number of arguments is ridiculous, I will not allow it.\n", + *argv); + return 1; + } + + /* Stymied if the effective user is not root. */ + if (geteuid() != ROOT_USER_UID) + { + fprintf(stderr, + "%s: the effective user is not root, cannot continue.\n", + *argv); + return 1; + } + + /* Create directory for socket files, PID files and such. */ + if (stat(MDS_RUNTIME_ROOT_DIRECTORY, &attr) == 0) + { + /* Cannot create the directory, its pathname refers to an existing. */ + if (S_ISDIR(attr.st_mode) == 0) + { + /* But it is not a directory so we cannot continue. */ + fprintf(stderr, + "%s: %s already exists but is not a directory.\n", + MDS_RUNTIME_ROOT_DIRECTORY, *argv); + return 1; + } + } + else + /* Directory is missing, create it. */ + if (mkdir(MDS_RUNTIME_ROOT_DIRECTORY, 0755) < 0) + if (errno != EEXIST) /* Unlikely race condition. */ + { + perror(*argv); + return 1; + } + + /* Drop privileges. They most not be propagated non-authorised components. */ + if (seteuid(getuid()) < 0) + { + perror(*argv); + return 1; + } + + return 0; +} + |