aboutsummaryrefslogtreecommitdiff
path: root/flx/flx.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--flx/flx.h264
1 files changed, 264 insertions, 0 deletions
diff --git a/flx/flx.h b/flx/flx.h
new file mode 100644
index 0000000..1113d4a
--- /dev/null
+++ b/flx/flx.h
@@ -0,0 +1,264 @@
+#ifndef __FLX_H__
+#define __FLX_H__
+
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <netinet/in.h>
+
+#include "utils.h"
+#include "md5.h"
+
+#define DUMPBASENAME "formilux-sig.dat"
+
+#define MD5_Init(ctx) ToolsMD5Init(ctx)
+#define MD5_Update(ctx, data, len) ToolsMD5Update(ctx, data, len)
+#define MD5_Final(data, ctx) ToolsMD5Final(data, ctx)
+
+#define O4(a) (htonl(*(int*)(a)))
+
+#define MATCH(f,m) (!strcmp(f, m))
+
+#define STATUS_REQUEST_DIR 0x0001
+#define STATUS_FILLED 0x0002
+
+#define SINGLE_DEV 0x0001
+#define HAVE_TO_CHECK 0x0002
+#define SHOW_SAME 0x0004
+#define SHOW_NEW 0x0008
+#define SHOW_OLD 0x0010
+#define SHOW_ALL (SHOW_SAME|SHOW_NEW|SHOW_OLD)
+#define GOPT_HUMAN_READABLE 0x0020
+#define GOPT_IGNORE_DOT 0x0040
+#define GOPT_IGNORE_DEPTH 0x0080
+
+#define FILE_TYPE(a) (S_ISLNK(a) ?'l':S_ISDIR(a) ?'d': \
+ S_ISCHR(a) ?'c':S_ISBLK(a) ?'b': \
+ S_ISFIFO(a)?'f':S_ISSOCK(a)?'s': \
+ S_ISREG(a) ?'-':'?')
+
+
+#define F_TYPE 0x0001
+#define F_MODE 0x0002
+#define F_OWNER 0x0004
+#define F_SIZE 0x0008
+#define F_DEV 0x0010
+#define F_CHECKSUM 0x0020
+#define F_LINK 0x0040
+#define F_TIME 0x0080
+#define F_LDATE 0x0100
+
+#define DIFF_TYPE F_TYPE
+#define DIFF_MODE F_MODE
+#define DIFF_OWNER F_OWNER
+#define DIFF_SIZE F_SIZE
+#define DIFF_DEV F_DEV
+#define DIFF_CHECKSUM F_CHECKSUM
+#define DIFF_LINK F_LINK
+#define DIFF_TIME F_TIME
+#define DIFF_LDATE F_LDATE
+#define DIFF_NOTFILLED 0x8000
+
+#define DELIM_BASE ':'
+#define DELIM_CHANGE '='
+#define DELIM_NEXT ','
+#define DELIM_LIST (char[]){ DELIM_BASE, DELIM_CHANGE, DELIM_NEXT, 0 }
+
+#define DIFF(a) (IS(Diff, DIFF_##a))
+// #define DIFF(a) (Diif)
+
+
+
+#define IS_DOTDOT(str) (*(str) == '.' && *((str)+1) == '.' && *((str)+2) == 0)
+#define IS_DOT(str) (*(str) == '.' && *((str)+1) == 0)
+#define IS_DOTF(str) (*(str) == '.' && \
+ (*((str)+1) == 0 || \
+ (*((str)+1) == '.' && *((str)+2) == 0)))
+
+#define IS_DOTD(str) (*(str) == '.' && \
+ (*((str)+1) == '/' || \
+ (*((str)+1) == '.' && *((str)+2) == '/')))
+
+
+
+#define IS_PDOT(ptr) ((ptr)->parent && \
+ (ptr)->subtree == (ptr)->parent->subtree)
+#define IS_PDOTDOT(ptr) ((ptr)->parent && (ptr)->parent->parent && \
+ (ptr)->subtree == (ptr)->parent->parent->subtree)
+#define IS_PDOTF(ptr) (IS_PDOT(ptr) || IS_PDOTDOT(ptr))
+
+
+#define ADD_PATH_DEFINE(pbegin, pend, filename) ({ \
+ char *__ret; \
+ if (filename) { \
+ *pend = 0; \
+ if (pend > pbegin && *(pend-1) != '/') strcpy(pend, "/") ; \
+ strncat((pend), (filename), BUFFER_LENGTH - ((pend) - (pbegin)) - 2); \
+ __ret = (pend) + strlen(pend); \
+ } else __ret = (pend) ; \
+ __ret; \
+})
+
+#define ADD_PATH(pbegin, pend, filename) add_path(pbegin, pend, filename)
+
+static inline char *add_path(char *pbegin, char *pend, char *filename) {
+ return (ADD_PATH_DEFINE(pbegin, pend, filename));
+}
+
+#define REMOVE_DIR_DEFINE(pbegin, pend) ({ \
+ char *__ret; \
+ if (!(pend = strrchr(pbegin, '/'))) __ret = (pbegin); \
+ else \
+ if (pend == pbegin) __ret = (pend+1); \
+ else __ret = (pend); \
+ __ret; \
+})
+
+#define REMOVE_DIR(pbegin, pend) remove_dir(pbegin, pend)
+
+static inline char *remove_dir(char *pbegin, char *pend) {
+ return (REMOVE_DIR_DEFINE(pbegin, pend));
+}
+
+#define COUNT_LEVEL1 100 /* number with all directory */
+#define COUNT_LEVEL2 100 /* maximum in a directory */
+#define NEWDIR(parent) ft_add(parent, NULL, NULL, NULL);
+
+/* structure definition for file tree */
+typedef struct s_file_tree t_file_tree ;
+typedef t_file_tree t_ft;
+
+
+struct s_file_tree {
+ t_file_tree *prev, *next; /* others file in same directory */
+ t_file_tree *parent; /* parent directory */
+ t_file_tree *subtree; /* pointer to sub directory */
+ char *filename; /* filename (without path) */
+ void *desc; /* pointer from specific data */
+
+
+
+#define FILLED 0x01
+#define CHANGED 0x02
+#define BASE 0x04
+#define WRITTEN 0x08
+#define SORTING 0x10
+#define SORTED 0x20
+#define READING 0x40
+ int status; /* status for file */
+};
+
+#define SET_MARK_CHANGED(ptr) set_parent(ptr, CHANGED)
+#define SET_PARENT(ptr, flag) set_parent(ptr, flag)
+
+static inline void set_parent(t_file_tree *cur, int flag) {
+ while (cur) {
+ if (IS(cur->status, flag)) break;
+ SET(cur->status, flag);
+ if (cur->parent == cur) break;
+ cur = cur->parent;
+ }
+}
+
+
+
+/* structure de définition des informations */
+
+typedef struct s_file_desc t_file_desc ;
+
+struct s_file_desc {
+ struct stat stat;
+ unsigned char *md5;
+ unsigned char *link;
+};
+
+#define FCT_DOIT3_PROTO(name) int (*name)(void *data, int order, \
+ t_file_tree *src1, \
+ t_file_tree *src2, \
+ t_file_tree *dst)
+
+
+typedef struct s_tree t_tree;
+
+struct s_tree {
+ t_tree *prev;
+ t_tree *next;
+ char *filename;
+ t_tree *subtree;
+ t_tree *parent;
+ u_int status;
+ struct stat stat;
+ u_char *checksum;
+ char *link;
+};
+
+typedef struct s_fctdata t_fctdata;
+
+struct s_fctdata {
+ void *(*fct)();
+ void *data;
+};
+
+
+typedef struct s_dtree t_dtree;
+
+struct s_dtree {
+ t_tree *tree1;
+ t_tree *tree2;
+};
+
+#define PROTO_FS(name) void *(name)(char *path, char *filename, struct stat *stat, void *data)
+#define PROTO_FILE(name) void *(name)(char *line, void *data)
+#define PROTO_SAVE(name) void *(name)(char *path, t_tree *new, void *data)
+
+
+extern int browse_over_path(char *path, void *(*fct)(), void *data) ;
+extern char *checksum_md5_from_file(char *file) ;
+extern char *checksum_md5_from_data(char *data, int len) ;
+extern char *end_field(char *line) ;
+extern int mkdir_with_parent(char *pathname, mode_t mode) ;
+extern char *build_line(char *path, char *filename, t_file_desc *info) ;
+extern void dump_tree(t_ft *tree) ;
+extern int dump_diff_tree(t_dtree *tree);
+extern int files_are_the_same(t_file_desc *f1, t_file_desc *f2, int Diff, char *path) ;
+extern char *build_path(t_ft *tree);
+extern t_tree *get_line(char *line) ;
+extern void free_tree(t_tree *tree);
+t_tree *get_from_signfs_line(char *line, char **rpath) ;
+char *remove_ended_slash(char *str) ;
+
+extern int browse_over_tree_from_path(char *path, void *(*add_fct)(), void *(*srch_fct)(), void *data) ;
+extern t_tree *build_new_tree_from_fs(char *path, char *filename, struct stat *stat, void *data) ;
+extern t_tree *build_check_tree_from_fs(char *path, char *filename, struct stat *stat, void *data) ;
+extern void *save_tree(char *path, t_tree *new, t_tree *tree) ;
+extern void *check_before_saving_tree(char *path, t_tree *new, t_dtree *dtree) ;
+extern void *build_new_tree_from_mfile(char *path, char *filename, struct stat *stat, void *tree) ;
+extern void build_new_tree_from_file(char *path, void *(*fct)(), void *tree) ;
+extern void *build_check_tree_from_mfile(char *path, char *filename, struct stat *stat, void *tree) ;
+
+extern t_ft *get_tree(char *path, t_ft *tree) ;
+extern t_ft *get_path(char *path, t_ft *tree) ;
+extern t_ft *get_parent_tree(char *path, t_ft *data) ;
+
+int signfs_read_file(char *path, t_tree *tree);
+int signfs_read_fs(char *path, t_tree *tree);
+int signfs_dump_tree(t_tree *tree, char *output, int level);
+
+
+extern t_ft *ft_add(t_ft *base, char *pfilename, void *(*fct_init_desc)(), void *data);
+extern t_ft *ft_del(t_ft *old, void (*fct_free_desc)(void *data, void *desc), void *data);
+extern t_ft *ft_get(t_ft *tree, char *path);
+
+extern char *define_base_path(char *path);
+extern char *define_cleaned_path(char *path);
+
+
+/* device for xdev option */
+extern dev_t SingleDev;
+extern char *DumpFilename;
+extern int RecursionLevel;
+extern int Diff;
+extern int Options, Sorted;
+
+POOL_INIT_PROTO(t_file_tree);
+
+#endif /* __FLX_H__ */