00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 static int convert_old_files(char *path, char *newfiledb)
00045 {
00046 FILE *f, *fdb;
00047 char *s, *fn, *nick, *tm, *s1;
00048 filedb_entry *fdbe = NULL;
00049 int in_file = 0, i;
00050 struct stat st;
00051
00052 s = malloc(strlen(path) + 8);
00053 sprintf(s, "%s/.files", path);
00054 f = fopen(s, "r");
00055 free_null(s);
00056 if (f == NULL)
00057 return 0;
00058
00059 fdb = fopen(newfiledb, "w+b");
00060 if (!fdb) {
00061 putlog(LOG_MISC, "(!) Can't create filedb in %s", newfiledb);
00062 fclose(f);
00063 return 0;
00064 }
00065 lockfile(fdb);
00066 lockfile(f);
00067 filedb_initdb(fdb);
00068
00069 putlog(LOG_FILES, "*", _("Converting filesystem image in %s ..."), path);
00070
00071 while (!feof(f)) {
00072 s = malloc(121);
00073 s1 = s;
00074 fgets(s, 120, f);
00075 if (s[strlen(s) - 1] == '\n')
00076 s[strlen(s) - 1] = 0;
00077 if (!feof(f)) {
00078 fn = newsplit(&s1);
00079 rmspace(fn);
00080 if ((fn[0]) && (fn[0] != ';') && (fn[0] != '#')) {
00081
00082 if (fn[0] == '-') {
00083
00084 if (in_file && fdbe) {
00085 rmspace(s);
00086 if (fdbe->desc) {
00087 fdbe->desc = realloc(fdbe->desc,
00088 strlen(fdbe->desc) + strlen(s) + 2);
00089 strcat(fdbe->desc, "\n");
00090 } else
00091 fdbe->desc = malloc(strlen(s) + 2);
00092 strcat(fdbe->desc, s);
00093 }
00094 } else {
00095 if (fdbe) {
00096
00097 filedb_addfile(fdb, fdbe);
00098 free_fdbe(&fdbe);
00099 }
00100 fdbe = malloc_fdbe();
00101 in_file = 1;
00102 nick = newsplit(&s1);
00103 rmspace(nick);
00104 tm = newsplit(&s1);
00105 rmspace(tm);
00106 rmspace(s1);
00107 i = strlen(fn) - 1;
00108 if (fn[i] == '/')
00109 fn[i] = 0;
00110 realloc_strcpy(fdbe->filename, fn);
00111 realloc_strcpy(fdbe->uploader, nick);
00112 fdbe->gots = atoi(s1);
00113 fdbe->uploaded = atoi(tm);
00114 sprintf(s, "%s/%s", path, fn);
00115 if (stat(s, &st) == 0) {
00116
00117 if (S_ISDIR(st.st_mode)) {
00118 fdbe->stat |= FILE_DIR;
00119 if (nick[0] == '+') {
00120 char x[100];
00121
00122 struct flag_record fr = {FR_GLOBAL, 0, 0, 0, 0, 0};
00123
00124 break_down_flags(nick + 1, &fr, NULL);
00125 build_flags(x, &fr, NULL);
00126
00127 realloc_strcpy(fdbe->flags_req, x);
00128 }
00129 }
00130 fdbe->size = st.st_size;
00131 } else
00132 in_file = 0;
00133 }
00134 }
00135 }
00136 free_null(s);
00137 }
00138 if (fdbe) {
00139
00140 filedb_addfile(fdb, fdbe);
00141 free_fdbe(&fdbe);
00142 }
00143 fseek(fdb, 0L, SEEK_END);
00144 unlockfile(f);
00145 unlockfile(fdb);
00146 fclose(fdb);
00147 fclose(f);
00148 return 1;
00149 }
00150
00151
00152
00153
00154 static void convert_version1(FILE *fdb_s, FILE *fdb_t)
00155 {
00156 filedb1 fdb1;
00157
00158 fseek(fdb_s, 0L, SEEK_SET);
00159 while (!feof(fdb_s)) {
00160 fread(&fdb1, sizeof(filedb1), 1, fdb_s);
00161 if (!feof(fdb_s)) {
00162 if (!(fdb1.stat & FILE_UNUSED)) {
00163 filedb_entry *fdbe = malloc_fdbe();
00164
00165 fdbe->stat = fdb1.stat;
00166 if (fdb1.filename[0])
00167 realloc_strcpy(fdbe->filename, fdb1.filename);
00168 if (fdb1.desc[0])
00169 realloc_strcpy(fdbe->desc, fdb1.desc);
00170 if (fdb1.uploader[0])
00171 realloc_strcpy(fdbe->uploader, fdb1.uploader);
00172 if (fdb1.flags_req[0])
00173 realloc_strcpy(fdbe->flags_req, fdb1.flags_req);
00174 fdbe->uploaded = fdb1.uploaded;
00175 fdbe->size = fdb1.size;
00176 fdbe->gots = fdb1.gots;
00177 filedb_addfile(fdb_s, fdbe);
00178 free_fdbe(&fdbe);
00179 }
00180 }
00181 }
00182 }
00183
00184
00185
00186
00187 static void convert_version2(FILE *fdb_s, FILE *fdb_t)
00188 {
00189 filedb2 fdb2;
00190
00191 fseek(fdb_s, 0L, SEEK_SET);
00192 while (!feof(fdb_s)) {
00193 fread(&fdb2, sizeof(filedb2), 1, fdb_s);
00194 if (!feof(fdb_s)) {
00195 if (!(fdb2.stat & FILE_UNUSED)) {
00196 filedb_entry *fdbe = malloc_fdbe();
00197
00198 fdbe->stat = fdb2.stat;
00199 if (fdb2.filename[0])
00200 realloc_strcpy(fdbe->filename, fdb2.filename);
00201 if (fdb2.desc[0])
00202 realloc_strcpy(fdbe->desc, fdb2.desc);
00203 if (fdb2.chname[0])
00204 realloc_strcpy(fdbe->chan, fdb2.chname);
00205 if (fdb2.uploader[0])
00206 realloc_strcpy(fdbe->uploader, fdb2.uploader);
00207 if (fdb2.flags_req[0])
00208 realloc_strcpy(fdbe->flags_req, fdb2.flags_req);
00209 fdbe->uploaded = fdb2.uploaded;
00210 fdbe->size = fdb2.size;
00211 fdbe->gots = fdb2.gots;
00212 filedb_addfile(fdb_t, fdbe);
00213 free_fdbe(&fdbe);
00214 }
00215 }
00216 }
00217 }
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231 static int convert_old_db(FILE **fdb_s, char *filedb)
00232 {
00233 filedb_top fdbt;
00234 FILE *fdb_t;
00235 int ret = 0;
00236
00237 filedb_readtop(*fdb_s, &fdbt);
00238
00239 if (fdbt.version > 0 && fdbt.version < FILEDB_VERSION3) {
00240 char *tempdb;
00241
00242 putlog(LOG_MISC, "*", "Converting old filedb %s to newest format.",
00243 filedb);
00244
00245 tempdb = malloc(strlen(filedb) + 5);
00246 simple_sprintf(tempdb, "%s-tmp", filedb);
00247
00248 fdb_t = fopen(tempdb, "w+b");
00249 if (fdb_t) {
00250 filedb_initdb(fdb_t);
00251
00252
00253
00254
00255 if (fdbt.version == FILEDB_VERSION1)
00256 convert_version1(*fdb_s, fdb_t);
00257 else
00258 convert_version2(*fdb_s, fdb_t);
00259
00260 unlockfile(*fdb_s);
00261 fclose(fdb_t);
00262 fclose(*fdb_s);
00263
00264
00265 if (movefile(tempdb, filedb))
00266 putlog(LOG_MISC, "*", "(!) Moving file db from %s to %s failed.",
00267 tempdb, filedb);
00268
00269 *fdb_s = fopen(filedb, "r+b");
00270 if (*fdb_s) {
00271 lockfile(*fdb_s);
00272
00273
00274
00275
00276 ret = 1;
00277 } else
00278 putlog(LOG_MISC, "*", "(!) Reopening db %s failed.", filedb);
00279 }
00280 free_null(tempdb);
00281
00282 } else if (fdbt.version == FILEDB_VERSION3) {
00283 ret = 1;
00284
00285 } else {
00286 putlog(LOG_MISC, "*", "(!) Unknown db version: %d", fdbt.version);
00287 }
00288 if (!ret)
00289 putlog(LOG_MISC, "*", "Conversion of filedb %s failed.", filedb);
00290 return ret;
00291 }