diff --git a/automount.c b/automount.c index 5391b38..080a4d0 100644 --- a/automount.c +++ b/automount.c @@ -22,34 +22,18 @@ * SOFTWARE. */ -#define _POSIX_C_SOURCE 200809L +#include #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" +#include "util.h" +#include "disk.h" #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[]) { @@ -108,40 +92,4 @@ int main (int argc, char *argv[]) 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/disk.c b/disk.c new file mode 100644 index 0000000..c8185db --- /dev/null +++ b/disk.c @@ -0,0 +1,26 @@ +/* + * 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. + */ + +#include "disk.h" +#include "util.h" diff --git a/disk.h b/disk.h new file mode 100644 index 0000000..02dbef3 --- /dev/null +++ b/disk.h @@ -0,0 +1,54 @@ +/* + * 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. + */ + +#ifndef _DISK_H +#define _DISK_H + +/* Block info data type */ +// TODO: add this stupid data type. Maybe have a list of parents and have +// pending "strings" of children attached to them like +// truct parent_l { struct child_l { }; }; + +struct partition_list { + const char *name; + struct partition_list *next; +}; + +struct disk_list { + const char *name; + struct partition_list *parts; + struct disk_list *next; +}; + +struct disk_list * disk_get_by_name (struct disk_list *, const char *); +void disk_rm_by_name (struct disk_list *, const char *); +void disk_list_free (struct disk_list *); +void disk_list_add (struct disk_list *, struct disk_list *); + +struct partition_list * disk_part_get_by_name (struct disk_list *, const char *); +void partition_rm_by_name (struct partition_list *, const char *); +void partition_list_free (struct partition_list *); +void partition_list_add (struct partition_list *, struct partition_list *); + +#endif diff --git a/makefile b/makefile index cb7af69..c3f779a 100644 --- a/makefile +++ b/makefile @@ -1,10 +1,15 @@ +CPPFLAGS = -D_POSIX_C_SOURCE=200809L -D_DEFAULT_SOURCE CFLAGS = -Wall -Werror -pedantic -O2 -std=c99 CC = gcc +SRC = automount.c util.c disk.c +OBJ = ${SRC:.c=.o} -automount: automount.c +all: automount -debug: automount.c +automount: ${OBJ} + +debug: ${OBJ} ${CC} ${LDFLAGS} -O0 -g -o automount_debug $? clean: - rm -f automount automount_debug + rm -f automount automount_debug *.o diff --git a/util.c b/util.c new file mode 100644 index 0000000..98ff977 --- /dev/null +++ b/util.c @@ -0,0 +1,75 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include "util.h" + +/* Exit printing an error message and error string based on errno */ +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); +} + +/* Prints the command usage flags and brief description */ +void usage (void) +{ + puts("Usage: automount [-h]\n" + "-h print this message\n"); +} + +/* If the supplied path is a link, it returns the real absolute path, else it + * returns the supplied path + */ +const char * get_path (const char *sym) +{ + static char buf[256]; + memset(buf, 0, 256); + + if (readlink(sym, buf, 256) < 0 || *buf == '0') + return sym; + if (buf[255]) + return NULL; + + return buf; +} diff --git a/util.h b/util.h new file mode 100644 index 0000000..f43fd07 --- /dev/null +++ b/util.h @@ -0,0 +1,44 @@ +/* + * 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. + */ + +#ifndef _UTIL_H +#define _UTIL_H + +/* 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 red(str) ANSI_COLOR_RED str ANSI_COLOR_RESET +#define yellow(str) ANSI_COLOR_YELLOW str ANSI_COLOR_RESET + +void die (const char *, ...); +void usage (void); +const char * get_path (const char *); + +#endif