diff options
Diffstat (limited to '')
-rw-r--r-- | DEPENDENCIES | 18 | ||||
-rw-r--r-- | Makefile | 61 | ||||
-rw-r--r-- | src/alarm.c | 95 |
3 files changed, 174 insertions, 0 deletions
diff --git a/DEPENDENCIES b/DEPENDENCIES new file mode 100644 index 0000000..9556cd0 --- /dev/null +++ b/DEPENDENCIES @@ -0,0 +1,18 @@ +RUNTIME DEPENDENCIES: + + libc + + +BUILD DEPENDENCIES: + + make + c99 + libc + coreutils + + +INSTALL DEPENDENCIES: + + make + coreutils + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..19aa4bc --- /dev/null +++ b/Makefile @@ -0,0 +1,61 @@ +# 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 resource path excluding prefix. +DATA ?= /share +# The command path including prefix. +BINDIR ?= $(PREFIX)$(BIN) +# The resource path including prefix. +DATADIR ?= $(PREFIX)$(DATA) +# The license base path including prefix. +LICENSEDIR ?= $(DATADIR)/licenses + +# The name of the package as it should be installed. +PKGNAME ?= alarm +# The name of the command as it should be installed. +COMMAND ?= alarm + + +# 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 = c99 + + +.PHONY: all +all: bin/alarm + +bin/alarm: obj/alarm.o + @mkdir -p bin + $(CC) $(WARN) -std=$(STD) $(OPTIMISE) $(LDFLAGS) -o $@ $^ + +obj/%.o: src/%.c + @mkdir -p obj + $(CC) $(WARN) -std=$(STD) $(OPTIMISE) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< + + +.PHONY: clean +clean: + -rm -r bin obj + diff --git a/src/alarm.c b/src/alarm.c new file mode 100644 index 0000000..f66af7d --- /dev/null +++ b/src/alarm.c @@ -0,0 +1,95 @@ +/** + * alarm — Schedule an alarm for a program when starting it + * 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 <stdio.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <stddef.h> + + +int main(int argc, char** argv) +{ + char** cmdline = NULL; + long hours = 0; + long minutes = 0; + long seconds = 0; + long buf = 0; + int hms = 0; + char* time; + + if (argc < 3) + goto usage; + + time = argv[1]; + while (*time) + { + char c = *time++; + if (('0' <= c) && (c <= '9')) + buf = buf * 10 - (c & 15); + else if (strchr("hms", c)) + { + if (c == 'h') hours = -buf; + else if (c == 'm') minutes = -buf; + else if (c == 's') seconds = -buf; + buf = 0, hms = 1; + } + else + goto usage; + } + if (!hms) + { + if (strlen(argv[1]) < 1) + return 0; + seconds = -buf; + } + + seconds += minutes * 60; + seconds += hours * 60 * 60; + if ((seconds < 1) || (65535 < seconds)) + goto usage; + + cmdline = malloc((size_t)(argc - 1) * sizeof(char*)); + if (cmdline == NULL) + goto fail; + memcpy(cmdline, argv + 2, (size_t)(argc - 2) * sizeof(char*)); + cmdline[argc - 2] = NULL; + + alarm((unsigned)seconds); + execvp(argv[2], cmdline); + + fail: + perror(*argv); + free(cmdline); + return 1; + + usage: + printf("USAGE: %s <TIME> <COMMAND> <ARGS...>\n", *argv); + printf("\n"); + printf("Recognised patterns for <TIME>:\n"); + printf("\n"); + printf(" <SECONDS>[s]\n"); + printf(" <MINUTES>m[<SECONDS>s]\n"); + printf(" <HOURS>h[<MINUTES>m][<SECONDS>s]\n"); + printf("\n"); + printf(" All values are non-negative integers, and"); + printf(" the interal must be greater than zero and\n"); + printf(" at most 18h12m15s.\n"); + printf("\n"); + return 1; +} + |