diff options
Diffstat (limited to 'src/util/shared.c')
-rw-r--r-- | src/util/shared.c | 372 |
1 files changed, 0 insertions, 372 deletions
diff --git a/src/util/shared.c b/src/util/shared.c deleted file mode 100644 index 2e0c98a..0000000 --- a/src/util/shared.c +++ /dev/null @@ -1,372 +0,0 @@ -#include "shared.h" - -#include <ctype.h> -#include <errno.h> -#include <limits.h> -#include <stdarg.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <time.h> -#include <sys/stat.h> -#include <paths.h> - -extern char* cmd; - -void error_s(const char *format, ...) { - va_list list; - va_start(list, format); - - fprintf(stderr, "%s: ", cmd); - vfprintf(stderr, format, list); - fprintf(stderr, "\n"); -} - -void error(const char *format, ...) { - va_list list; - va_start(list, format); - - fprintf(stderr, "%s: ", cmd); - vfprintf(stderr, format, list); - fprintf(stderr, "\n"); - exit(EXIT_FAILURE); -} - -void output(const char *format, ...) { - va_list list; - va_start(list, format); - - fprintf(stdout, "%s: ", cmd); - vfprintf(stdout, format, list); - fprintf(stdout, "\n"); -} - -FILE* get_file_s(const char* path, const char* type) { - struct stat s; - FILE* file; - - if (streql("-", path) && type[0] == 'r') { - clearerr(stdin); - fflush(stdin); - return stdin; - } - - if (lstat(path, &s) < 0) { - if (type[0] != 'r') goto read; - error_s("failed to read %s: %s", path, strerror(errno)); - return NULL; - } - - if (S_ISDIR(s.st_mode)) { - error_s("%s is a directory", path); - return NULL; - } - -read: - - file = fopen(path, type); - - if (file == NULL) { - error_s("failed to %s file %s: %s", type[0] == 'r' ? "read" : "write", path, strerror(errno)); - } - - return file; -} - -FILE* get_file(const char* path, const char* type) { - FILE* file = get_file_s(path, type); - if (file == NULL) exit(EXIT_FAILURE); - return file; -} - -long int get_number(const char* text) { - char* end; - long int n = strtol(text, &end, 10); - if (text == end) { - error("%s is not a valid number", text); - } - return n; -} - -long int get_blkm(const char* text) { - char* end; - long int n = strtol(text, &end, 10); - if (text == end) { - error("%s is not a valid bkm", text); - } - if (*end == '\0') return n; - switch (*end) { - case 'K': - case 'k': - return n * 1024; - case 'B': - case 'b': - return n * 512; - case 'M': - case 'm': - return n * 1024 * 1204; - default: - error("invalid bkm type %c", *end); - } - - /* shouldnt get here anyways */ - return 0; -} - -mode_t get_mode(const char* next) { - char* end = NULL; - mode_t mode = (mode_t)strtol(next, &end, 8); - if (!end) return 0; - while(isspace(*end)) end++; - if (*end != '\0' || (unsigned) mode < 010000) { - error("invalid file mode: `%s`", next); - } - return mode; -} - -bool streql(const char* a, const char* b) { - int n = 0; - - if (*a != *b) return false; - - while (true) { - if (*(a+n) != *(b+n)) return false; - if (*(a+n) == '\0') return true; - ++n; - } -} - -bool prefix(const char* pre, const char* str) { - return strncmp(pre, str, strlen(pre)) == 0; -} - -static char fs_types[5] = {'K','M','G','T','P'}; -void print_file_size(size_t bytes, char buf[5]) { - int index, n; - float next; - - index = 0; - next = bytes; - - while (true) { - if (next < 1000) { - break; - } - - if (index == 5) { - printf("999P"); - return; - } - - next /= 1024; - index++; - } - - n = snprintf(buf, 4, "%u", (int)(next+.5)); - - if (index > 0) { - buf[n] = (fs_types[index - 1]); - n++; - } - - buf[n] = '\0'; -} - -static char* months[12] = - {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; -void print_date_time(time_t mills, char buf[13]) { - struct tm* info; - int n; - - info = localtime(&mills); - n = snprintf(buf, 5, "%s ", months[info->tm_mon]); - - if (info->tm_mday < 10) { - buf[n] = ' '; - n++; - } - - snprintf(buf + n, 13 - n, "%d %02d:%02d ", info->tm_mday, info->tm_hour, info->tm_sec); -} - -void print_file_path(char* path) { - if (streql("-", path)) { - printf("(standard input)"); - } else { - printf("%s", path); - } -} - -#ifndef MAJOR -#define MAJOR 0 -#endif - -#ifndef MINOR -#define MINOR 0 -#endif - -#ifndef PATCH -#define PATCH 0 -#endif - -void check_arg (char* arg) { - if (arg == NULL) { - error("expected another argument after option"); - } -} - -void global_help(void (*help)(void)) { - printf("LazySphere v%d.%d.%d multi-call binary.\n\n", MAJOR, MINOR, PATCH); - help(); - exit(EXIT_SUCCESS); -} - -void parse_help(int argc, char** argv, void (*help)(void)) { - int i; - - if (argc < 1) return; - - for (i = 0; i < argc; i++) { - if (!prefix("-", argv[i]) || streql("-", argv[i])) break; - if (help != NULL && streql("--help", argv[i])) global_help(help); - } -} - -int parse_args(int argc, char** argv, void (*help)(void), int (*short_arg)(char, char*), int (*long_arg)(char*, char*)) { - int start, i, current; - char* next_arg; - - if (argc < 1) return 0; - - start = 0; - for (i = 0; i < argc; i++) { - - if (!prefix("-", argv[i]) || streql("-", argv[i])) break; - if (help != NULL && streql("--help", argv[i])) global_help(help); - - if (i + 1 == argc) { - next_arg = NULL; - } else { - next_arg = argv[i+1]; - } - - current = i; - - if (prefix("--", argv[i])) { - int r; - - if (long_arg == NULL) { - goto exit; - } - - r = long_arg(argv[current], next_arg); - - if (r == ARG_USED) { - i++; - start++; - } else if (r == ARG_IGNORE) { - goto exit; - } else if (r == ARG_INVALID) { - error("invalid argument %s", argv[current]); - - } - } else { - size_t j; - int r; - - if (short_arg == NULL) { - goto exit; - } - - for (j = 1; j < strlen(argv[current]); j++) { - - r = short_arg(argv[current][j], next_arg); - - if (r == ARG_USED) { - i++; - start++; - } else if (r == ARG_IGNORE) { - goto exit; - } else if (r == ARG_INVALID) { - error("invalid argument -%c", argv[current][j]); - } - } - } - - start++; - } - -exit: - - return start; -} - -int get_tty (void) { - int fd = open(_PATH_TTY, O_RDONLY); - if (fd < 0) error("failed to get tty: %s", strerror(errno)); - return fd; -} - -FILE* get_tty_stream(char* type) { - int fd = get_tty(); - FILE* file = fdopen(fd, type); - if (file == NULL) { - error("failed to open tty stream: %s", strerror(errno)); - } - return file; -} - -static int push_path_buffer_b(char* buf, int* index, const char* string) { - int save, string_len; - - save = *index; - if (*index > 1 || (*index == 1 && buf[0] != '/')) { - buf[(*index)++] = '/'; - } - - string_len = strlen(string); - memcpy(buf + *index, string, string_len + 1); - - *index += string_len; - - return save; -} - -static void pop_path_buffer_b(char* buf, int* index, int i) { - *index = i; - buf[*index] = '\0'; -} - -static char path_buffer[PATH_MAX + 1]; -static int path_buffer_index = 0; - -char* get_path_buffer(void) { - return path_buffer; -} - -int push_path_buffer(const char* string) { - return push_path_buffer_b(path_buffer, &path_buffer_index, string); -} - -void pop_path_buffer(int i) { - pop_path_buffer_b(path_buffer, &path_buffer_index, i); -} - -static char path_buffer_2[PATH_MAX + 1]; -static int path_buffer_index_2 = 0; - -char* get_path_buffer_2(void) { - return path_buffer_2; -} - -int push_path_buffer_2(const char* string) { - return push_path_buffer_b(path_buffer_2, &path_buffer_index_2, string); -} - -void pop_path_buffer_2(int i) { - pop_path_buffer_b(path_buffer_2, &path_buffer_index_2, i); -} - -bool is_dot_dir(const char* path) { - return streql(path, ".") || streql(path, ".."); -} |