dav/sync.c

changeset 204
4f0207044837
parent 200
cc474cf2c2f5
child 205
bf756f6c3581
equal deleted inserted replaced
203:9a93ebd71984 204:4f0207044837
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) {

mercurial