88 int ret = EXIT_FAILURE; |
88 int ret = EXIT_FAILURE; |
89 if(!strcmp(cmd, "pull")) { |
89 if(!strcmp(cmd, "pull")) { |
90 ret = cmd_pull(args); |
90 ret = cmd_pull(args); |
91 } else if(!strcmp(cmd, "push")) { |
91 } else if(!strcmp(cmd, "push")) { |
92 ret = cmd_push(args); |
92 ret = cmd_push(args); |
|
93 } else if(!strcmp(cmd, "trash-info")) { |
|
94 ret = cmd_trash_info(args); |
|
95 } else if(!strcmp(cmd, "empty-trash")) { |
|
96 ret = cmd_empty_trash(args); |
93 } else if(!strcmp(cmd, "add-directory")) { |
97 } else if(!strcmp(cmd, "add-directory")) { |
94 ret = cmd_add_directory(args); |
98 ret = cmd_add_directory(args); |
95 } else if(!strcmp(cmd, "list-directories")) { |
99 } else if(!strcmp(cmd, "list-directories")) { |
96 ret = list_syncdirs(); |
100 ret = list_syncdirs(); |
97 } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) { |
101 } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) { |
111 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd); |
115 fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd); |
112 |
116 |
113 fprintf(stderr, "Commands:\n"); |
117 fprintf(stderr, "Commands:\n"); |
114 fprintf(stderr, " pull [-c] <directory>\n"); |
118 fprintf(stderr, " pull [-c] <directory>\n"); |
115 //fprintf(stderr, " push [-r] <directory>\n\n"); |
119 //fprintf(stderr, " push [-r] <directory>\n\n"); |
116 fprintf(stderr, " push <directory>\n\n"); |
120 fprintf(stderr, " push <directory>\n"); |
|
121 fprintf(stderr, " trash-info <directory>\n"); |
|
122 fprintf(stderr, " empty-trash <directory>\n\n"); |
117 |
123 |
118 fprintf(stderr, "Options:\n"); |
124 fprintf(stderr, "Options:\n"); |
119 fprintf(stderr, " -c Disable conflict detection\n\n"); |
125 fprintf(stderr, " -c Disable conflict detection\n"); |
120 //fprintf(stderr, " -r Read changes from stdin\n\n"); |
126 //fprintf(stderr, " -r Read changes from stdin\n\n"); |
|
127 fprintf(stderr, " -v verbose output (all commands)\n\n"); |
121 |
128 |
122 fprintf(stderr, "Config commands:\n"); |
129 fprintf(stderr, "Config commands:\n"); |
123 fprintf(stderr, " add-directory\n"); |
130 fprintf(stderr, " add-directory\n"); |
124 fprintf(stderr, " list-directories\n\n"); |
131 fprintf(stderr, " list-directories\n\n"); |
125 } |
132 } |
1031 dav_resource_free(res); |
1038 dav_resource_free(res); |
1032 |
1039 |
1033 return ret; |
1040 return ret; |
1034 } |
1041 } |
1035 |
1042 |
|
1043 // TODO: remove code dup (main.c ls_size_str) |
|
1044 static char* size_str(uint64_t size) { |
|
1045 char *str = malloc(16); |
|
1046 |
|
1047 if(size < 0x400) { |
|
1048 snprintf(str, 16, "%" PRIu64 " bytes", size); |
|
1049 } else if(size < 0x100000) { |
|
1050 float s = (float)size/0x400; |
|
1051 int diff = (s*100 - (int)s*100); |
|
1052 if(diff > 90) { |
|
1053 diff = 0; |
|
1054 s += 0.10f; |
|
1055 } |
|
1056 if(size < 0x2800 && diff != 0) { |
|
1057 // size < 10 KiB |
|
1058 snprintf(str, 16, "%.1f KiB", s); |
|
1059 } else { |
|
1060 snprintf(str, 16, "%.0f KiB", s); |
|
1061 } |
|
1062 } else if(size < 0x40000000) { |
|
1063 float s = (float)size/0x100000; |
|
1064 int diff = (s*100 - (int)s*100); |
|
1065 if(diff > 90) { |
|
1066 diff = 0; |
|
1067 s += 0.10f; |
|
1068 } |
|
1069 if(size < 0xa00000 && diff != 0) { |
|
1070 // size < 10 MiB |
|
1071 snprintf(str, 16, "%.1f MiB", s); |
|
1072 } else { |
|
1073 size /= 0x100000; |
|
1074 snprintf(str, 16, "%.0f MiB", s); |
|
1075 } |
|
1076 } else if(size < 0x1000000000ULL) { |
|
1077 float s = (float)size/0x40000000; |
|
1078 int diff = (s*100 - (int)s*100); |
|
1079 if(diff > 90) { |
|
1080 diff = 0; |
|
1081 s += 0.10f; |
|
1082 } |
|
1083 if(size < 0x280000000 && diff != 0) { |
|
1084 // size < 10 GiB |
|
1085 snprintf(str, 16, "%.1f GiB", s); |
|
1086 } else { |
|
1087 size /= 0x40000000; |
|
1088 snprintf(str, 16, "%.0f GiB", s); |
|
1089 } |
|
1090 } else { |
|
1091 size /= 1024; |
|
1092 float s = (float)size/0x40000000; |
|
1093 int diff = (s*100 - (int)s*100); |
|
1094 if(diff > 90) { |
|
1095 diff = 0; |
|
1096 s += 0.10f; |
|
1097 } |
|
1098 if(size < 0x280000000 && diff != 0) { |
|
1099 // size < 10 TiB |
|
1100 snprintf(str, 16, "%.1f TiB", s); |
|
1101 } else { |
|
1102 size /= 0x40000000; |
|
1103 snprintf(str, 16, "%.0f TiB", s); |
|
1104 } |
|
1105 } |
|
1106 return str; |
|
1107 } |
|
1108 |
|
1109 int cmd_trash_info(CmdArgs *a) { |
|
1110 if(a->argc != 1) { |
|
1111 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
|
1112 return -1; |
|
1113 } |
|
1114 |
|
1115 SyncDirectory *syncdir = scfg_get_dir(a->argv[0]); |
|
1116 if(!syncdir) { |
|
1117 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); |
|
1118 return -1; |
|
1119 } |
|
1120 |
|
1121 if(!syncdir->trash) { |
|
1122 printf("trash not configured\n", syncdir->name); |
|
1123 return 0; |
|
1124 } |
|
1125 |
|
1126 DIR *dir = opendir(syncdir->trash); |
|
1127 if(!dir) { |
|
1128 fprintf(stderr, "cannot open trash directory: %s\n", syncdir->trash); |
|
1129 perror("opendir"); |
|
1130 return -1; |
|
1131 } |
|
1132 |
|
1133 uint64_t trashsize = 0; |
|
1134 int count = 0; |
|
1135 struct dirent *ent; |
|
1136 while((ent = readdir(dir)) != NULL) { |
|
1137 if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { |
|
1138 continue; |
|
1139 } |
|
1140 |
|
1141 char *path = util_concat_path(syncdir->trash, ent->d_name); |
|
1142 |
|
1143 struct stat s; |
|
1144 if(stat(path, &s)) { |
|
1145 perror("stat"); |
|
1146 } else { |
|
1147 trashsize += s.st_size; |
|
1148 } |
|
1149 count++; |
|
1150 |
|
1151 free(path); |
|
1152 } |
|
1153 closedir(dir); |
|
1154 |
|
1155 printf("path: %s\n", syncdir->trash); |
|
1156 printf("%d %s\n", count, count == 1 ? "file" : "files"); |
|
1157 char *sizestr = size_str(trashsize); |
|
1158 printf("%s\n", sizestr); |
|
1159 free(sizestr); |
|
1160 |
|
1161 return 0; |
|
1162 } |
|
1163 |
|
1164 |
|
1165 int cmd_empty_trash(CmdArgs *a) { |
|
1166 if(a->argc != 1) { |
|
1167 fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
|
1168 return -1; |
|
1169 } |
|
1170 |
|
1171 SyncDirectory *syncdir = scfg_get_dir(a->argv[0]); |
|
1172 if(!syncdir) { |
|
1173 fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); |
|
1174 return -1; |
|
1175 } |
|
1176 |
|
1177 if(!syncdir->trash) { |
|
1178 fprintf(stderr, "trash not configured for %s\n", syncdir->name); |
|
1179 return -1; |
|
1180 } |
|
1181 |
|
1182 DIR *dir = opendir(syncdir->trash); |
|
1183 if(!dir) { |
|
1184 fprintf(stderr, "cannot open trash directory: %s\n", syncdir->trash); |
|
1185 perror("opendir"); |
|
1186 return -1; |
|
1187 } |
|
1188 |
|
1189 struct dirent *ent; |
|
1190 while((ent = readdir(dir)) != NULL) { |
|
1191 if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { |
|
1192 continue; |
|
1193 } |
|
1194 |
|
1195 char *path = util_concat_path(syncdir->trash, ent->d_name); |
|
1196 printf("delete: %s\n", path); |
|
1197 |
|
1198 struct stat s; |
|
1199 if(stat(path, &s)) { |
|
1200 perror("stat"); |
|
1201 free(path); |
|
1202 continue; |
|
1203 } |
|
1204 if(S_ISDIR(s.st_mode)) { |
|
1205 if(rmdir(path)) { |
|
1206 perror("unlink"); |
|
1207 } |
|
1208 } else { |
|
1209 if(unlink(path)) { |
|
1210 perror("unlink"); |
|
1211 } |
|
1212 } |
|
1213 |
|
1214 free(path); |
|
1215 } |
|
1216 closedir(dir); |
|
1217 |
|
1218 return 0; |
|
1219 } |
1036 |
1220 |
1037 int cmd_add_directory(CmdArgs *args) { |
1221 int cmd_add_directory(CmdArgs *args) { |
1038 printf("Each sync directory must have an unique name.\n"); |
1222 printf("Each sync directory must have an unique name.\n"); |
1039 char *name = assistant_getcfg("name"); |
1223 char *name = assistant_getcfg("name"); |
1040 if(!name) { |
1224 if(!name) { |