From 30fdeacab47dbaaeeddeaefe8305b65994315816 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Thu, 24 Sep 2020 21:19:21 +0200 Subject: [PATCH] initiate commitment protocol --- .gitignore | 5 ++ LICENSE | 21 ++++++++ README.md | 0 automount.c | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++ makefile | 10 ++++ 5 files changed, 183 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 automount.c create mode 100644 makefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b0578b8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +automount* +tests/** +!**/*.c +!**/*.c + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ee709b3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Alessandro Mauri + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/automount.c b/automount.c new file mode 100644 index 0000000..5391b38 --- /dev/null +++ b/automount.c @@ -0,0 +1,147 @@ +/* + * MIT License + * + * Copyright (c) 2020 Alessandro Mauri + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#define _POSIX_C_SOURCE 200809L +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ANSI colors escape codes */ +#define ANSI_COLOR_RED "\x1b[31m" +#define ANSI_COLOR_GREEN "\x1b[32m" +#define ANSI_COLOR_YELLOW "\x1b[33m" +#define ANSI_COLOR_BLUE "\x1b[34m" +#define ANSI_COLOR_MAGENTA "\x1b[35m" +#define ANSI_COLOR_CYAN "\x1b[36m" +#define ANSI_COLOR_RESET "\x1b[0m" + +#define DEV_BLOCK_ROOT "/dev/block/" + +#define red(str) ANSI_COLOR_RED str ANSI_COLOR_RESET +#define yellow(str) ANSI_COLOR_YELLOW str ANSI_COLOR_RESET + +static void die (const char *, ...); +static void usage (void); +static const char * get_path (const char *); + +int main (int argc, char *argv[]) +{ + struct pollfd watchpoll = {0, POLLIN, 0}; + const struct inotify_event *event; + char buf[4096], strbuf[256]; + char *ptr; + int opt, len, fd; + + while ((opt = getopt(argc, argv, "h")) != -1) { + switch (opt) { + case 'h': + usage(); + exit(EXIT_SUCCESS); + break; + default: + puts(red("Option not recognized\n")); + usage(); + exit(EXIT_FAILURE); + break; + } + } + + if ((fd = inotify_init()) < 0) + die("error initializing inotify watch list"); + watchpoll.fd = fd; + if (inotify_add_watch(fd, DEV_BLOCK_ROOT, IN_CREATE | IN_DELETE) < 0) + die ("error adding " DEV_BLOCK_ROOT " to the watch list"); + + for (;poll(&watchpoll, 1, -1);) { + if (watchpoll.revents != POLLIN) + continue; + + len = read(watchpoll.fd, buf, sizeof(buf)); + if (len < 0) { + printf(red("read error: %s\n"), strerror(errno)); + break; + } else if (!len) { + puts("No data to read\n"); + break; + } + + for (ptr = buf; ptr < buf + len; + ptr += sizeof(struct inotify_event) + event->len) { + event = (const struct inotify_event *) ptr; + if(!event->len) + continue; + strcpy(strbuf, DEV_BLOCK_ROOT); + strcat(strbuf, event->name); + printf(yellow("%s: %s\n"), event->mask & IN_CREATE ? "Created" : "Removed", get_path(strbuf)); + } + } + die("polling interrupted"); + + close(watchpoll.fd); + return 0; +} + +static void die(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + fputs(ANSI_COLOR_RED, stderr); + vfprintf(stderr, fmt, ap); + + if (fmt[0] && fmt[strlen(fmt) - 1] == ':') { + fputc(' ', stderr); + perror(NULL); + } else { + fputc('\n', stderr); + } + fputs(ANSI_COLOR_RESET, stderr); + + va_end(ap); + exit(errno ? errno : 1); +} + +static void usage (void) +{ + puts("Usage: automount [-h]\n" + "-h print this message\n"); +} + +static const char * get_path (const char *sym) +{ + static char buf[256]; + memset(buf, 0, 256); + + readlink(sym, buf, 256); + if (buf[255]) + return NULL; + + return buf; +} diff --git a/makefile b/makefile new file mode 100644 index 0000000..cb7af69 --- /dev/null +++ b/makefile @@ -0,0 +1,10 @@ +CFLAGS = -Wall -Werror -pedantic -O2 -std=c99 +CC = gcc + +automount: automount.c + +debug: automount.c + ${CC} ${LDFLAGS} -O0 -g -o automount_debug $? + +clean: + rm -f automount automount_debug