diff options
Diffstat (limited to 'src/b_sqb_file.c')
-rw-r--r-- | src/b_sqb_file.c | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/src/b_sqb_file.c b/src/b_sqb_file.c new file mode 100644 index 0000000..c3a568d --- /dev/null +++ b/src/b_sqb_file.c @@ -0,0 +1,100 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* b_sqb_file.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: rbousset <marvin@42.fr> +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/02/14 17:19:27 by rbousset #+# #+# */ +/* Updated: 2020/02/14 17:19:29 by rbousset ### ########lyon.fr */ +/* */ +/* ************************************************************************** */ + +#include <sys/stat.h> +#include <libft.h> +#include <stdint.h> +#include <fcntl.h> +#include <unistd.h> + +#include "d_define.h" + +static t_bool + b_file_tests(uint8_t id, + const char path[], + struct stat sb) +{ + if (id == FT_ID_SQB_B && S_ISBLK(sb.st_mode) == 1) + return (TRUE); + else if (id == FT_ID_SQB_C && S_ISCHR(sb.st_mode) == 1) + return (TRUE); + else if (id == FT_ID_SQB_D && S_ISDIR(sb.st_mode) == 1) + return (TRUE); + else if (id == FT_ID_SQB_F && S_ISREG(sb.st_mode) == 1) + return (TRUE); + else if ((id == FT_ID_SQB_H || id == FT_ID_SQB_L_MAJ) + && S_ISLNK(sb.st_mode) == 1) + return (TRUE); + else if (id == FT_ID_SQB_P && S_ISFIFO(sb.st_mode) == 1) + return (TRUE); + else if (id == FT_ID_SQB_R && access(path, R_OK) == 0) + return (TRUE); + else if (id == FT_ID_SQB_S && sb.st_size > 0) + return (TRUE); + else if (id == FT_ID_SQB_W && access(path, W_OK) == 0) + return (TRUE); + else if (id == FT_ID_SQB_X && access(path, X_OK) == 0) + return (TRUE); + else if (id == FT_ID_SQB_S_MAJ && S_ISSOCK(sb.st_mode) == 0) + return (TRUE); + return (FALSE); +} + +uint8_t + b_sqb_file_tests(uint8_t id, + char *argv[]) +{ + struct stat sb; + + if (access(argv[1], 0) == -1) + return (1); + if (id == FT_ID_SQB_E) + return (0); + if (id == FT_ID_SQB_H || id == FT_ID_SQB_L_MAJ) + lstat(argv[1], &sb); + else + stat(argv[1], &sb); + if (b_file_tests(id, argv[1], sb) == TRUE) + return (0); + return (1); +} + +static t_bool + b_sqb_file_comp_tests(uint8_t id, + struct stat sb1, + struct stat sb2) +{ + if (id == FT_ID_SQB_NT && + sb1.st_mtim.tv_sec > sb2.st_mtim.tv_sec) + return (TRUE); + else if (id == FT_ID_SQB_OT && + sb1.st_mtim.tv_sec < sb2.st_mtim.tv_sec) + return (TRUE); + return (FALSE); +} + +uint8_t + b_sqb_double_file_tests(uint8_t id, + char *argv[]) +{ + struct stat sb[2]; + + if (access(argv[0], 0) == -1) + return (1); + if (access(argv[2], 0) == -1) + return (1); + stat(argv[0], &sb[0]); + stat(argv[2], &sb[1]); + if (b_sqb_file_comp_tests(id, sb[0], sb[1]) == TRUE) + return (0); + return (1); +} |