#include "file.h" #include "error.h" #include "convert.h" #include #include #include #include #include #include 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; } 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; }