-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutility.h
159 lines (128 loc) · 4.81 KB
/
utility.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <stdint.h>
extern volatile char globalStop;
void output_error(int errnum);
int parse_port(char * port);
ssize_t send_all(int socket,const void * data,size_t len,int sig);
ssize_t read_all(int socket,void * data,size_t len,int sig);
/* .Mainfest: The records of all files and folders (exclude the manifest)
hash: for folder, md5_hash for files
<nodecount>
<index> <type> <folderHead> <nextFile>\n<hash>\n<name>\n
*/
/* Folder.txt
index type hash nextFile folderHead
*/
typedef struct FolderStructureNode{
int index;
char type;
/*0: Uninitialized
1: File
2: Folder
*/
int version;
char name[256];
uint8_t hash[16];
struct FolderStructureNode * nextFile, * folderHead;
} FolderStructureNode;
/* FolderDiff.txt
index type name oldhash newHash nextFile folderHead
*/
typedef struct FolderDiffNode{
char name[256];
char type;
/*0: Uninitialized
1: Uplaod new file
2: Modified file
3: Add new file
4: Delete file
5: Upload folder
6: Modified Folder
7: Add Folder
8: Delete Folder
*/
char oldHash[16],newHash[16];
struct FolderDiffNode * nextFile, * folderHead;
} FolderDiffNode;
// typedef struct UpdateInfo{
// char *file_name;
// char
// }
typedef struct MD5FileInfo{
uint8_t hash[16];
int file_size;
char * data;
}MD5FileInfo;
typedef struct HashMapNode{
const char * key;
void * nodePtr;
struct HashMapNode * next;
} HashMapNode;
typedef struct HashMap{
HashMapNode ** map;
int size;
} HashMap;
typedef struct HistoryBuffer{
// int version_num;
char hash[33];
struct HistoryBuffer *nextBuffer;
}HistoryBuffer;
int GetHash(const char * str);
HashMap * InitializeHashMap(int size);
HashMap *hashify_layer(FolderStructureNode *root);
HashMapNode * HashMapInsert(HashMap * hmap, const char * key,void * nodePtr);
HashMapNode * HashMapFind(HashMap * hmap,const char * key);
void DestroyHashMap(HashMap * hmap);
//FolderStructureNode * ConstructStructureFromPath(const char * path);
void PrintHashMap(HashMap * hmap);
// return NULL if fails
void CreateEmptyFolderStructFromPath(const char *original_path);
FolderStructureNode * ConstructStructureFromFile(const char * path);
FolderStructureNode * CreateFolderStructNode(const char type, const char *name, const char *hash, FolderStructureNode *nextFile, FolderStructureNode *folderHead, int version);
FolderStructureNode *SearchStructNodeLayer(const char *name, FolderStructureNode *root);
void FreeFolderStructNode(FolderStructureNode *root);
FolderDiffNode * ConstructDifference(FolderStructureNode * oldTree,FolderStructureNode * newTree);
FolderDiffNode * ConstructDifferenceFromFile(FILE * fd);
void DestroyStructure(FolderStructureNode * tree);
void DestroyDifference(FolderDiffNode * diff);
void ApplyDiff(FolderStructureNode * oldTree,FolderDiffNode * diff);
void RevertDiff(FolderStructureNode * newTree,FolderDiffNode * diff);
void SerializeStructure(FolderStructureNode * tree,FILE *fd);
void SerializeDifference(FolderDiffNode * diff,FILE * fd);
//uint32_t ComputeCRC32(const char * data,int len);
void GetMD5(const uint8_t *initial_msg, size_t initial_len, uint32_t * output_array);
/* Types of command:
delt
null
updt
ckot
pushs
dist
*/
int SendMessage(int sockfd, char command[4], const char *msg,int msg_len);
//Send message length first, then message body
void SendPacket(int socket, const char * pkt);
/*SendFile protocol
256(name) 16(hash) 4(file_size) real content
*/
int SendFile(int socket, char *project_name, char *file_name, char * mani_hash);
void HandleSendFile(int sockfd, char *metadata_src);
int HandleComplete(int sockfd, char *project_name);
int HandleHistory(int sockfd, char *project_name);
int PushVersion(int sockfd, char *project_name);
int HandlePushVersion(int sockfd, char *metadata_src);
//Split the file into packets of fixed size, and send each packet sequentially.
//void SendFileFromMani(int sockfd, FolderStructureNode *root, int parent_folder_fd, char *parent_folder_name);
void DeleteFile(int socket, const char * path);
//void CreateEmptyFolderStructFromMani(FolderStructureNode *root, int parent_folder_fd, char *parent_folder_name);
char *ReceiveMessage(int sockfd);
char *ReceiveFile(int sockfd, const char *project_name, const char *file_name);
int HandleRecieveFile(int sockfd, char *metadata_src);
// 0 for find success, -1 for find none
int IsProject(const char *path);
void GetMD5(const uint8_t * data, size_t data_len, uint32_t * output_array);
MD5FileInfo *GetMD5FileInfo(int file_fd);
char *convert_path_to_hexmd5(char filename[32]);
char *convert_hexmd5_to_path(unsigned char hash[16]);
char *combine_path(const char* par_path, const char * cur_path);
FolderStructureNode *remove_node_from_root(FolderStructureNode *root, const char *file_name);
int remove_dir(char *path);