68 CmdArgs *args = cmd_parse_args(argc - 2, argv + 2); |
68 CmdArgs *args = cmd_parse_args(argc - 2, argv + 2); |
69 if(!args) { |
69 if(!args) { |
70 print_usage(argv[0]); |
70 print_usage(argv[0]); |
71 return -1; |
71 return -1; |
72 } |
72 } |
73 |
|
74 xmlGenericErrorFunc fnc = xmlerrorfnc; |
|
75 initGenericErrorDefaultFunc(&fnc); |
|
76 ctx = dav_context_new(); |
|
77 ctx->key_input = util_key_input; |
|
78 load_config(ctx); |
|
79 |
|
80 // copy proxy config |
|
81 memcpy(ctx->http_proxy, get_http_proxy(), sizeof(Proxy)); |
|
82 memcpy(ctx->https_proxy, get_https_proxy(), sizeof(Proxy)); |
|
83 |
|
84 if(load_sync_config()) { |
|
85 return EXIT_FAILURE; |
|
86 } |
|
87 |
|
88 int ret = EXIT_FAILURE; |
73 int ret = EXIT_FAILURE; |
|
74 |
|
75 int loadcfg = 1; |
|
76 if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) { |
|
77 fprintf(stderr, "dav-sync %s\n", DAV_VERSION); |
|
78 loadcfg = 0; |
|
79 } |
|
80 |
|
81 if(loadcfg) { |
|
82 xmlGenericErrorFunc fnc = xmlerrorfnc; |
|
83 initGenericErrorDefaultFunc(&fnc); |
|
84 ctx = dav_context_new(); |
|
85 ctx->key_input = util_key_input; |
|
86 load_config(ctx); |
|
87 |
|
88 // copy proxy config |
|
89 memcpy(ctx->http_proxy, get_http_proxy(), sizeof(Proxy)); |
|
90 memcpy(ctx->https_proxy, get_https_proxy(), sizeof(Proxy)); |
|
91 |
|
92 if(load_sync_config()) { |
|
93 return EXIT_FAILURE; |
|
94 } |
|
95 } |
|
96 |
89 if(!strcmp(cmd, "pull")) { |
97 if(!strcmp(cmd, "pull")) { |
90 ret = cmd_pull(args); |
98 ret = cmd_pull(args); |
91 } else if(!strcmp(cmd, "push")) { |
99 } else if(!strcmp(cmd, "push")) { |
92 ret = cmd_push(args); |
100 ret = cmd_push(args); |
|
101 } else if(!strcmp(cmd, "resolve-conflicts")) { |
|
102 ret = cmd_resolve_conflicts(args); |
|
103 } else if(!strcmp(cmd, "delete-conflicts")) { |
|
104 ret = cmd_delete_conflicts(args); |
93 } else if(!strcmp(cmd, "trash-info")) { |
105 } else if(!strcmp(cmd, "trash-info")) { |
94 ret = cmd_trash_info(args); |
106 ret = cmd_trash_info(args); |
95 } else if(!strcmp(cmd, "empty-trash")) { |
107 } else if(!strcmp(cmd, "empty-trash")) { |
96 ret = cmd_empty_trash(args); |
108 ret = cmd_empty_trash(args); |
97 } else if(!strcmp(cmd, "add-directory")) { |
109 } else if(!strcmp(cmd, "add-directory")) { |
98 ret = cmd_add_directory(args); |
110 ret = cmd_add_directory(args); |
99 } else if(!strcmp(cmd, "list-directories")) { |
111 } else if(!strcmp(cmd, "list-directories")) { |
100 ret = list_syncdirs(); |
112 ret = list_syncdirs(); |
101 } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) { |
|
102 fprintf(stderr, "dav-sync %s\n", DAV_VERSION); |
|
103 } |
113 } |
104 |
114 |
105 // TODO: cleanup sync config (don't forget to call regfree for regex) |
115 // TODO: cleanup sync config (don't forget to call regfree for regex) |
106 |
116 |
107 return ret; |
117 return ret; |
1062 dav_resource_free(res); |
1072 dav_resource_free(res); |
1063 |
1073 |
1064 return ret; |
1074 return ret; |
1065 } |
1075 } |
1066 |
1076 |
|
1077 |
|
1078 int cmd_resolve_conflicts(CmdArgs *a) { |
|
1079 if(a->argc != 1) { |
|
1080 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
|
1081 return -1; |
|
1082 } |
|
1083 |
|
1084 SyncDirectory *dir = scfg_get_dir(a->argv[0]); |
|
1085 if(!dir) { |
|
1086 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); |
|
1087 return -1; |
|
1088 } |
|
1089 |
|
1090 SyncDatabase *db = load_db(dir->database); |
|
1091 if(!db) { |
|
1092 fprintf(stderr, "Cannot load database file: %s\n", dir->database); |
|
1093 return -1; |
|
1094 } |
|
1095 |
|
1096 // remove conflicts |
|
1097 int num_conflict = db->conflict->count; |
|
1098 //TODO: ucx_map_free_content(db->conflict, destr); |
|
1099 ucx_map_clear(db->conflict); |
|
1100 |
|
1101 // store db |
|
1102 if(store_db(db, dir->database)) { |
|
1103 fprintf(stderr, "Cannot store sync db\n"); |
|
1104 fprintf(stderr, "Abort\n"); |
|
1105 return -1; // TODO: don't return here |
|
1106 } |
|
1107 |
|
1108 // Report |
|
1109 char *str_conflict = num_conflict == 1 ? "conflict" : "conflicts"; |
|
1110 printf("Result: %d %s resolved\n", num_conflict, str_conflict); |
|
1111 |
|
1112 return 0; |
|
1113 } |
|
1114 |
|
1115 int cmd_delete_conflicts(CmdArgs *a) { |
|
1116 if(a->argc != 1) { |
|
1117 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
|
1118 return -1; |
|
1119 } |
|
1120 |
|
1121 SyncDirectory *dir = scfg_get_dir(a->argv[0]); |
|
1122 if(!dir) { |
|
1123 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); |
|
1124 return -1; |
|
1125 } |
|
1126 |
|
1127 SyncDatabase *db = load_db(dir->database); |
|
1128 if(!db) { |
|
1129 fprintf(stderr, "Cannot load database file: %s\n", dir->database); |
|
1130 return -1; |
|
1131 } |
|
1132 |
|
1133 int num_del = 0; |
|
1134 int num_err = 0; |
|
1135 |
|
1136 // delete all conflict files |
|
1137 UcxMapIterator i = ucx_map_iterator(db->conflict); |
|
1138 LocalResource *res; |
|
1139 UCX_MAP_FOREACH(key, res, i) { |
|
1140 printf("delete: %s\n", res->path); |
|
1141 char *path = util_concat_path(dir->path, res->path); |
|
1142 if(unlink(path)) { |
|
1143 if(errno != ENOENT) { |
|
1144 perror("unlink"); |
|
1145 num_err++; |
|
1146 } |
|
1147 } else { |
|
1148 num_del++; |
|
1149 } |
|
1150 free(path); |
|
1151 } |
|
1152 //TODO: ucx_map_free_content(db->conflict, destr); |
|
1153 ucx_map_clear(db->conflict); |
|
1154 |
|
1155 // store db |
|
1156 if(store_db(db, dir->database)) { |
|
1157 fprintf(stderr, "Cannot store sync db\n"); |
|
1158 fprintf(stderr, "Abort\n"); |
|
1159 return -1; // TODO: don't return here |
|
1160 } |
|
1161 |
|
1162 // Report |
|
1163 char *str_delete = num_del == 1 ? "file" : "files"; |
|
1164 char *str_error = num_err == 1 ? "error" : "errors"; |
|
1165 printf("Result: %d conflict %s deleted, %d %s\n", |
|
1166 num_del, str_delete, |
|
1167 num_err, str_error); |
|
1168 |
|
1169 return 0; |
|
1170 } |
|
1171 |
|
1172 |
1067 // TODO: remove code dup (main.c ls_size_str) |
1173 // TODO: remove code dup (main.c ls_size_str) |
1068 static char* size_str(uint64_t size) { |
1174 static char* size_str(uint64_t size) { |
1069 char *str = malloc(16); |
1175 char *str = malloc(16); |
1070 |
1176 |
1071 if(size < 0x400) { |
1177 if(size < 0x400) { |