aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile83
-rw-r--r--README2
-rw-r--r--src/config.h39
-rw-r--r--src/mds.c89
4 files changed, 212 insertions, 1 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..cd4d467
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,83 @@
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided the copyright
+# notice and this notice are preserved. This file is offered as-is,
+# without any warranty.
+
+
+# The package path prefix, if you want to install to another root, set DESTDIR to that root
+PREFIX ?= /usr
+# The command path excluding prefix
+BIN ?= /bin
+# The library path excluding prefix
+LIB ?= /lib
+# The executable library path excluding prefix
+LIBEXEC ?= /libexec
+# The resource path excluding prefix
+DATA ?= /share
+# The command path including prefix
+BINDIR ?= $(PREFIX)$(BIN)
+# The library path including prefix
+LIBDIR ?= $(PREFIX)$(LIB)
+# The executable library path including prefix
+LIBEXECDIR ?= $(PREFIX)$(LIBEXEC)
+# The resource path including prefix
+DATADIR ?= $(PREFIX)$(DATA)
+# The generic documentation path including prefix
+DOCDIR ?= $(DATADIR)/doc
+# The info manual documentation path including prefix
+INFODIR ?= $(DATADIR)/info
+# The license base path including prefix
+LICENSEDIR ?= $(DATADIR)/licenses
+
+# The name of the package as it should be installed
+PKGNAME ?= blueshift
+
+
+# Optimisation level (and debug flags.)
+OPTIMISE = -Og -g
+
+# Enabled Warnings.
+WARN = -Wall -Wextra -pedantic -Wdouble-promotion -Wformat=2 -Winit-self \
+ -Wmissing-include-dirs -Wtrampolines -Wfloat-equal -Wshadow \
+ -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls \
+ -Wnested-externs -Winline -Wno-variadic-macros -Wsign-conversion \
+ -Wswitch-default -Wconversion -Wsync-nand -Wunsafe-loop-optimizations \
+ -Wcast-align -Wstrict-overflow -Wdeclaration-after-statement -Wundef \
+ -Wbad-function-cast -Wcast-qual -Wwrite-strings -Wlogical-op \
+ -Waggregate-return -Wstrict-prototypes -Wold-style-definition -Wpacked \
+ -Wvector-operation-performance -Wunsuffixed-float-constants \
+ -Wsuggest-attribute=const -Wsuggest-attribute=noreturn \
+ -Wsuggest-attribute=pure -Wsuggest-attribute=format -Wnormalized=nfkc
+
+# The C standard used in the code.
+STD = gnu99
+
+# Options for the C compiler.
+C_FLAGS = $(OPTIMISE) $(WARN) -std=$(STD) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) \
+ -ftree-vrp -fstrict-aliasing -fipa-pure-const -fstack-usage \
+ -fstrict-overflow -funsafe-loop-optimizations -fno-builtin \
+ -D_GNU_SOURCE
+
+
+# Build rules.
+
+.PHONY: all
+all: bin/mds
+
+bin/mds: obj/mds.o
+ mkdir -p bin
+ gcc $(C_FLAGS) -o $@ $^
+
+
+obj/mds.o: src/mds.c
+ mkdir -p obj
+ gcc $(C_FLAGS) -c -o $@ $^
+
+
+
+# Clean rules.
+
+.PHONY: clean
+clean:
+ -rm -r obj bin
+
diff --git a/README b/README
index de702e2..6c4cd61 100644
--- a/README
+++ b/README
@@ -10,7 +10,7 @@ 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 setuid flag set.
+parts that need the special privileges.
Is this vaporware? Probably I often bored with graphical
projects. Graphics sucks.
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;
+}
+