Go to the source code of this file.
Defines | |
#define | filedb_read(fdb, entry, len) |
Functions | |
static int | wild_match_file (register char *m, register char *n) |
static void | free_fdbe (filedb_entry **fdbe) |
static filedb_entry * | _malloc_fdbe (char *file, int line) |
static void | lockfile (FILE *fdb) |
static void | unlockfile (FILE *f) |
static int | filedb_readtop (FILE *fdb, filedb_top *fdbt) |
static int | filedb_writetop (FILE *fdb, filedb_top *fdbt) |
static int | filedb_delfile (FILE *fdb, long pos) |
static filedb_entry * | filedb_findempty (FILE *fdb, int tot) |
static int | _filedb_updatefile (FILE *fdb, long pos, filedb_entry *fdbe, int update, char *file, int line) |
static int | _filedb_movefile (FILE *fdb, long pos, filedb_entry *fdbe, char *file, int line) |
static int | _filedb_addfile (FILE *fdb, filedb_entry *fdbe, char *file, int line) |
static filedb_entry * | _filedb_getfile (FILE *fdb, long pos, int get, char *file, int line) |
static filedb_entry * | _filedb_matchfile (FILE *fdb, long pos, char *match, char *file, int line) |
static void | filedb_cleanup (FILE *fdb) |
static void | filedb_mergeempty (FILE *fdb) |
static filedb_entry * | filedb_getentry (char *dir, char *fn) |
static void | filedb_initdb (FILE *fdb) |
static void | filedb_timestamp (FILE *fdb) |
static void | filedb_update (char *path, FILE *fdb, int sort) |
static char * | make_point_path (char *path) |
static FILE * | filedb_open (char *path, int sort) |
static void | filedb_close (FILE *fdb) |
static void | filedb_add (FILE *fdb, char *filename, char *nick) |
static void | filedb_ls (FILE *fdb, int idx, char *mask, int showall) |
static void | filedb_getdesc (char *dir, char *fn, char **desc) |
static void | filedb_getowner (char *dir, char *fn, char **owner) |
static int | filedb_getgots (char *dir, char *fn) |
static void | filedb_setdesc (char *dir, char *fn, char *desc) |
static void | filedb_setowner (char *dir, char *fn, char *owner) |
static void | filedb_getfiles (Tcl_Interp *irp, char *dir) |
static void | filedb_getdirs (Tcl_Interp *irp, char *dir) |
static void | filedb_change (char *dir, char *fn) |
Variables | |
static int | count = 0 |
#define filedb_read | ( | fdb, | |||
entry, | |||||
len | ) |
Value:
{ \
if ((len) > 0) { \
(entry) = malloc((len)); \
fread((entry), 1, (len), (fdb)); \
} \
}
Definition at line 461 of file filedb3.c.
Referenced by _filedb_getfile().
static int _filedb_addfile | ( | FILE * | fdb, | |
filedb_entry * | fdbe, | |||
char * | file, | |||
int | line | |||
) | [static] |
Definition at line 451 of file filedb3.c.
References _filedb_updatefile(), filedb_entry::_type, POS_NEW, TYPE_NEW, and UPDATE_ALL.
00452 { 00453 fdbe->_type = TYPE_NEW; 00454 _filedb_updatefile(fdb, POS_NEW, fdbe, UPDATE_ALL, file, line); 00455 return 0; 00456 }
static filedb_entry* _filedb_getfile | ( | FILE * | fdb, | |
long | pos, | |||
int | get, | |||
char * | file, | |||
int | line | |||
) | [static] |
Definition at line 474 of file filedb3.c.
References _malloc_fdbe(), filedb_entry::_type, filedb_entry::buf_len, filedb_header::buffer_len, filedb_entry::chan, filedb_header::chan_len, filedb_entry::desc, filedb_header::desc_len, filedb_entry::dyn_len, FILE_UNUSED, filedb_read, filedb_tot_dynspace, filedb_entry::filename, filedb_header::filename_len, filedb_entry::flags_req, filedb_header::flags_req_len, GET_FILENAME, GET_FULL, filedb_header::gots, filedb_entry::gots, NULL, filedb_entry::pos, filedb_header::size, filedb_entry::size, filedb_header::stat, filedb_entry::stat, TYPE_EXIST, filedb_header::uploaded, filedb_entry::uploaded, filedb_entry::uploader, and filedb_header::uploader_len.
Referenced by _filedb_matchfile().
00476 { 00477 filedb_entry *fdbe; 00478 filedb_header fdh; 00479 00480 /* Read header */ 00481 fseek(fdb, pos, SEEK_SET); 00482 fread(&fdh, 1, sizeof(filedb_header), fdb); 00483 if (feof(fdb)) 00484 return NULL; 00485 00486 /* Allocate memory for file db entry */ 00487 fdbe = _malloc_fdbe(file, line); 00488 00489 /* Optimisation: maybe use memcpy here? */ 00490 fdbe->uploaded = fdh.uploaded; 00491 fdbe->size = fdh.size; 00492 fdbe->stat = fdh.stat; 00493 fdbe->gots = fdh.gots; 00494 00495 fdbe->buf_len = fdh.buffer_len; 00496 fdbe->dyn_len = filedb_tot_dynspace(fdh); 00497 fdbe->pos = pos; /* Save position */ 00498 fdbe->_type = TYPE_EXIST; /* Entry exists in DB */ 00499 00500 /* Read additional data from db */ 00501 if (get >= GET_FILENAME) { 00502 filedb_read(fdb, fdbe->filename, fdh.filename_len); 00503 } else 00504 fseek(fdb, fdh.filename_len, SEEK_CUR); 00505 if (get < GET_FULL || (fdh.stat & FILE_UNUSED)) 00506 fseek(fdb, filedb_tot_dynspace(fdh) - fdh.filename_len, SEEK_CUR); 00507 else if (get == GET_FULL) { 00508 filedb_read(fdb, fdbe->desc, fdh.desc_len); 00509 filedb_read(fdb, fdbe->chan, fdh.chan_len); 00510 filedb_read(fdb, fdbe->uploader, fdh.uploader_len); 00511 filedb_read(fdb, fdbe->flags_req, fdh.flags_req_len); 00512 } 00513 fseek(fdb, fdh.buffer_len, SEEK_CUR); /* Skip buffer */ 00514 return fdbe; /* Return the ready structure */ 00515 }
static filedb_entry* _filedb_matchfile | ( | FILE * | fdb, | |
long | pos, | |||
char * | match, | |||
char * | file, | |||
int | line | |||
) | [static] |
Definition at line 520 of file filedb3.c.
References _filedb_getfile(), FILE_UNUSED, filedb_getfile, filedb_entry::filename, free_fdbe(), GET_FILENAME, GET_FULL, NULL, filedb_entry::stat, and wild_match_file().
00522 { 00523 filedb_entry *fdbe = NULL; 00524 00525 fseek(fdb, pos, SEEK_SET); 00526 while (!feof(fdb)) 00527 { 00528 pos = ftell(fdb); 00529 fdbe = filedb_getfile(fdb, pos, GET_FILENAME); 00530 if (fdbe) { 00531 if (!(fdbe->stat & FILE_UNUSED) && /* Not unused? */ 00532 wild_match_file(match, fdbe->filename)) { /* Matches our mask? */ 00533 free_fdbe(&fdbe); 00534 fdbe = _filedb_getfile(fdb, pos, GET_FULL, 00535 file, line); /* Save all data now */ 00536 return fdbe; 00537 } 00538 free_fdbe(&fdbe); 00539 } 00540 } 00541 return NULL; 00542 }
static int _filedb_movefile | ( | FILE * | fdb, | |
long | pos, | |||
filedb_entry * | fdbe, | |||
char * | file, | |||
int | line | |||
) | [static] |
Definition at line 441 of file filedb3.c.
References _filedb_updatefile(), filedb_entry::_type, TYPE_EXIST, and UPDATE_ALL.
00443 { 00444 fdbe->_type = TYPE_EXIST; 00445 _filedb_updatefile(fdb, pos, fdbe, UPDATE_ALL, file, line); 00446 return 0; 00447 }
static int _filedb_updatefile | ( | FILE * | fdb, | |
long | pos, | |||
filedb_entry * | fdbe, | |||
int | update, | |||
char * | file, | |||
int | line | |||
) | [static] |
Definition at line 325 of file filedb3.c.
References filedb_entry::_type, filedb_entry::buf_len, filedb_header::buffer_len, filedb_entry::chan, filedb_header::chan_len, filedb_entry::desc, filedb_header::desc_len, filedb_entry::dyn_len, filedb_delfile(), filedb_findempty(), filedb_tot_dynspace, filedb_entry::filename, filedb_header::filename_len, filedb_entry::flags_req, filedb_header::flags_req_len, free_fdbe(), filedb_entry::gots, filedb_header::gots, filedb_entry::pos, POS_NEW, filedb_entry::size, filedb_header::size, filedb_entry::stat, filedb_header::stat, TYPE_EXIST, UPDATE_ALL, UPDATE_SIZE, filedb_entry::uploaded, filedb_header::uploaded, filedb_entry::uploader, and filedb_header::uploader_len.
Referenced by _filedb_addfile(), and _filedb_movefile().
00327 { 00328 filedb_header fdh; 00329 int reposition = 0; 00330 int ndyntot, odyntot, nbuftot, obuftot; 00331 00332 memset(&fdh, 0, sizeof(filedb_header)); 00333 fdh.uploaded = fdbe->uploaded; 00334 fdh.size = fdbe->size; 00335 fdh.stat = fdbe->stat; 00336 fdh.gots = fdbe->gots; 00337 00338 /* Only add the buffer length if the buffer is not empty. Otherwise it 00339 * would result in lots of 1 byte entries which actually don't contain 00340 * any data. 00341 */ 00342 if (fdbe->filename) 00343 fdh.filename_len = strlen(fdbe->filename) + 1; 00344 if (fdbe->desc) 00345 fdh.desc_len = strlen(fdbe->desc) + 1; 00346 if (fdbe->chan) 00347 fdh.chan_len = strlen(fdbe->chan) + 1; 00348 if (fdbe->uploader) 00349 fdh.uploader_len = strlen(fdbe->uploader) + 1; 00350 if (fdbe->flags_req) 00351 fdh.flags_req_len = strlen(fdbe->flags_req) + 1; 00352 00353 odyntot = fdbe->dyn_len; /* Old length of dynamic data */ 00354 obuftot = fdbe->buf_len; /* Old length of spare space */ 00355 ndyntot = filedb_tot_dynspace(fdh); /* New length of dynamic data */ 00356 nbuftot = obuftot; 00357 00358 if (fdbe->_type == TYPE_EXIST) { 00359 /* If we only update the header, we don't need to worry about 00360 * sizes and just use the old place (i.e. the place pointed 00361 * to by pos). 00362 */ 00363 if (update < UPDATE_ALL) { 00364 /* Unless forced to it, we ignore new buffer sizes if we do not 00365 * run in UPDATE_ALL mode. 00366 */ 00367 if (update != UPDATE_SIZE) { 00368 ndyntot = odyntot; 00369 nbuftot = obuftot; 00370 } 00371 } else { 00372 /* If we have a given/preferred position */ 00373 if ((pos != POS_NEW) && 00374 /* and if our new size is smaller than the old size, we 00375 * just adjust the buffer length and still use the same 00376 * position 00377 */ 00378 (ndyntot <= (odyntot + obuftot))) { 00379 nbuftot = (odyntot + obuftot) - ndyntot; 00380 } else { 00381 /* If we have an existing position, but the new entry doesn't 00382 * fit into it's old home, we need to delete it before 00383 * repositioning. 00384 */ 00385 if (pos != POS_NEW) 00386 filedb_delfile(fdb, pos); 00387 reposition = 1; 00388 } 00389 } 00390 } else { 00391 fdbe->_type = TYPE_EXIST; /* Update type */ 00392 reposition = 1; 00393 } 00394 00395 /* Search for a new home */ 00396 if (reposition) { 00397 filedb_entry *n_fdbe; 00398 00399 n_fdbe = filedb_findempty(fdb, filedb_tot_dynspace(fdh)); 00400 fdbe->pos = pos = n_fdbe->pos; 00401 /* If we create a new entry (instead of using an existing one), 00402 * buf_len is zero 00403 */ 00404 if (n_fdbe->buf_len > 0) 00405 /* Note: empty entries have dyn_len set to zero, so we only 00406 * need to consider buf_len. 00407 */ 00408 nbuftot = n_fdbe->buf_len - ndyntot; 00409 else 00410 nbuftot = 0; 00411 free_fdbe(&n_fdbe); 00412 } 00413 00414 /* Set length of dynamic data and buffer */ 00415 fdbe->dyn_len = ndyntot; 00416 fdbe->buf_len = fdh.buffer_len = nbuftot; 00417 00418 /* Write header */ 00419 fseek(fdb, pos, SEEK_SET); 00420 fwrite(&fdh, 1, sizeof(filedb_header), fdb); 00421 /* Write dynamic data */ 00422 if (update == UPDATE_ALL) { 00423 if (fdbe->filename) 00424 fwrite(fdbe->filename, 1, fdh.filename_len, fdb); 00425 if (fdbe->desc) 00426 fwrite(fdbe->desc, 1, fdh.desc_len, fdb); 00427 if (fdbe->chan) 00428 fwrite(fdbe->chan, 1, fdh.chan_len, fdb); 00429 if (fdbe->uploader) 00430 fwrite(fdbe->uploader, 1, fdh.uploader_len, fdb); 00431 if (fdbe->flags_req) 00432 fwrite(fdbe->flags_req, 1, fdh.flags_req_len, fdb); 00433 } else 00434 fseek(fdb, ndyntot, SEEK_CUR); /* Skip over dynamic data */ 00435 fseek(fdb, nbuftot, SEEK_CUR); /* Skip over buffer */ 00436 return 0; 00437 }
static filedb_entry* _malloc_fdbe | ( | char * | file, | |
int | line | |||
) | [static] |
Definition at line 159 of file filedb3.c.
References filedb_entry::_type, NULL, and TYPE_NEW.
Referenced by _filedb_getfile().
00160 { 00161 filedb_entry *fdbe = NULL; 00162 00163 fdbe = calloc(1, sizeof(filedb_entry)); 00164 00165 /* Mark as new, will be overwritten if necessary. */ 00166 fdbe->_type = TYPE_NEW; 00167 return fdbe; 00168 }
static void filedb_add | ( | FILE * | fdb, | |
char * | filename, | |||
char * | nick | |||
) | [static] |
Definition at line 891 of file filedb3.c.
References filedb_matchfile, filedb_readtop(), filedb_updatefile, free_fdbe(), now, NULL, filedb_entry::pos, UPDATE_ALL, filedb_entry::uploaded, and filedb_entry::uploader.
Referenced by add_file().
00892 { 00893 filedb_entry *fdbe = NULL; 00894 00895 filedb_readtop(fdb, NULL); 00896 /* When the filedb was opened, a record was already created. */ 00897 fdbe = filedb_matchfile(fdb, ftell(fdb), filename); 00898 if (!fdbe) 00899 return; 00900 free_null(fdbe->uploader); 00901 realloc_strcpy(fdbe->uploader, nick); 00902 fdbe->uploaded = now; 00903 filedb_updatefile(fdb, fdbe->pos, fdbe, UPDATE_ALL); 00904 free_fdbe(&fdbe); 00905 }
static void filedb_change | ( | char * | dir, | |
char * | fn | |||
) | [static] |
Definition at line 1173 of file filedb3.c.
References FILE_DIR, filedb_close(), filedb_matchfile, filedb_open(), filedb_readtop(), filedb_updatefile, free_fdbe(), NULL, filedb_entry::pos, filedb_entry::stat, and UPDATE_HEADER.
Referenced by tcl_hide(), and tcl_unhide().
01174 { 01175 FILE *fdb; 01176 filedb_entry *fdbe; 01177 int changed = 0; 01178 01179 fdb = filedb_open(dir, 0); 01180 if (!fdb) 01181 return; 01182 filedb_readtop(fdb, NULL); 01183 fdbe = filedb_matchfile(fdb, ftell(fdb), fn); 01184 if (fdbe) { 01185 if (!(fdbe->stat & FILE_DIR)) 01186 changed = 1; 01187 if (changed) 01188 filedb_updatefile(fdb, fdbe->pos, fdbe, UPDATE_HEADER); 01189 free_fdbe(&fdbe); 01190 } 01191 filedb_close(fdb); 01192 }
static void filedb_cleanup | ( | FILE * | fdb | ) | [static] |
Definition at line 547 of file filedb3.c.
References FILE_UNUSED, filedb_getfile, filedb_movefile, filedb_readtop(), free_fdbe(), GET_FULL, GET_HEADER, NULL, and filedb_entry::stat.
Referenced by filedb_update().
00548 { 00549 long oldpos, newpos, temppos; 00550 filedb_entry *fdbe = NULL; 00551 00552 filedb_readtop(fdb, NULL); /* Skip DB header */ 00553 newpos = temppos = oldpos = ftell(fdb); 00554 fseek(fdb, oldpos, SEEK_SET); /* Go to beginning */ 00555 while (!feof(fdb)) /* Loop until EOF */ 00556 { 00557 fdbe = filedb_getfile(fdb, oldpos, GET_HEADER); /* Read header */ 00558 if (fdbe) { 00559 if (fdbe->stat & FILE_UNUSED) { /* Found dirt! */ 00560 free_fdbe(&fdbe); 00561 while (!feof(fdb)) { /* Loop until EOF */ 00562 newpos = ftell(fdb); 00563 fdbe = filedb_getfile(fdb, newpos, GET_FULL); /* Read next entry */ 00564 if (!fdbe) 00565 break; 00566 if (!(fdbe->stat & FILE_UNUSED)) { /* Not unused? */ 00567 temppos = ftell(fdb); 00568 filedb_movefile(fdb, oldpos, fdbe); /* Move to top */ 00569 oldpos = ftell(fdb); 00570 fseek(fdb, temppos, SEEK_SET); 00571 } 00572 free_fdbe(&fdbe); 00573 } 00574 } else { 00575 free_fdbe(&fdbe); 00576 oldpos = ftell(fdb); 00577 } 00578 } 00579 } 00580 ftruncate(fileno(fdb), oldpos); /* Shorten file */ 00581 }
static void filedb_close | ( | FILE * | fdb | ) | [static] |
Definition at line 878 of file filedb3.c.
References count, filedb_timestamp(), and unlockfile().
Referenced by add_file(), cmd_desc(), cmd_hide(), cmd_mkdir(), cmd_mv_cp(), cmd_optimize(), cmd_reget_get(), cmd_rm(), cmd_rmdir(), cmd_unhide(), filedb_change(), filedb_getdirs(), filedb_getentry(), filedb_getfiles(), filedb_setdesc(), filedb_setowner(), files_ls(), files_reget(), incr_file_gots(), resolve_dir(), tcl_mkdir(), tcl_mv_cp(), tcl_rmdir(), tcl_setflags(), and welcome_to_files().
00879 { 00880 filedb_timestamp(fdb); 00881 fseek(fdb, 0L, SEEK_END); 00882 count--; 00883 unlockfile(fdb); 00884 fclose(fdb); 00885 }
static int filedb_delfile | ( | FILE * | fdb, | |
long | pos | |||
) | [static] |
Definition at line 236 of file filedb3.c.
References filedb_header::buffer_len, FILE_UNUSED, filedb_tot_dynspace, filedb_zero_dynspace, and filedb_header::stat.
Referenced by _filedb_updatefile(), cmd_mv_cp(), cmd_rm(), cmd_rmdir(), filedb_update(), tcl_mv_cp(), and tcl_rmdir().
00237 { 00238 filedb_header fdh; 00239 00240 fseek(fdb, pos, SEEK_SET); /* Go to start of entry */ 00241 if (feof(fdb)) 00242 return 0; 00243 fread(&fdh, 1, sizeof(filedb_header), fdb); /* Read header */ 00244 fdh.stat = FILE_UNUSED; 00245 00246 /* Assign all available space to buffer. Simplifies 00247 * space calculation later on. 00248 */ 00249 fdh.buffer_len += filedb_tot_dynspace(fdh); 00250 filedb_zero_dynspace(fdh); 00251 00252 fseek(fdb, pos, SEEK_SET); /* Go back to start */ 00253 fwrite(&fdh, 1, sizeof(filedb_header), fdb); /* Write new header */ 00254 return 1; 00255 }
static filedb_entry* filedb_findempty | ( | FILE * | fdb, | |
int | tot | |||
) | [static] |
Definition at line 269 of file filedb3.c.
References filedb_entry::buf_len, FILE_UNUSED, FILEDB_ESTDYN, filedb_getfile, filedb_movefile, filedb_readtop(), free_fdbe(), GET_HEADER, malloc_fdbe, NULL, filedb_entry::pos, and filedb_entry::stat.
Referenced by _filedb_updatefile().
00270 { 00271 filedb_entry *fdbe; 00272 00273 filedb_readtop(fdb, NULL); 00274 fdbe = filedb_getfile(fdb, ftell(fdb), GET_HEADER); 00275 while (fdbe) { 00276 /* Found an existing, empty entry? */ 00277 if ((fdbe->stat & FILE_UNUSED) && (fdbe->buf_len >= tot)) { 00278 /* Do we have enough space to split up the entry to form 00279 * another empty entry? That way we would use the space 00280 * more efficiently. 00281 */ 00282 if (fdbe->buf_len > (tot + sizeof(filedb_header) + FILEDB_ESTDYN)) { 00283 filedb_entry *fdbe_oe; 00284 00285 /* Create new entry containing the additional space */ 00286 fdbe_oe = malloc_fdbe(); 00287 fdbe_oe->stat = FILE_UNUSED; 00288 fdbe_oe->pos = fdbe->pos + sizeof(filedb_header) + tot; 00289 fdbe_oe->buf_len = fdbe->buf_len - tot - sizeof(filedb_header); 00290 filedb_movefile(fdb, fdbe_oe->pos, fdbe_oe); 00291 free_fdbe(&fdbe_oe); 00292 00293 /* Cut down buf_len of entry as the rest is now used in the new 00294 * entry. 00295 */ 00296 fdbe->buf_len = tot; 00297 } 00298 return fdbe; 00299 } 00300 free_fdbe(&fdbe); 00301 fdbe = filedb_getfile(fdb, ftell(fdb), GET_HEADER); 00302 } 00303 00304 /* No existing entries, so create new entry at end of DB instead. */ 00305 fdbe = malloc_fdbe(); 00306 fseek(fdb, 0L, SEEK_END); 00307 fdbe->pos = ftell(fdb); 00308 return fdbe; 00309 }
static void filedb_getdesc | ( | char * | dir, | |
char * | fn, | |||
char ** | desc | |||
) | [static] |
Definition at line 1058 of file filedb3.c.
References filedb_entry::desc, filedb_getentry(), free_fdbe(), and NULL.
Referenced by tcl_getdesc().
01059 { 01060 filedb_entry *fdbe = NULL; 01061 01062 fdbe = filedb_getentry(dir, fn); 01063 if (fdbe) { 01064 *desc = strdup(fdbe->desc); 01065 free_fdbe(&fdbe); 01066 } else 01067 *desc = NULL; 01068 }
static void filedb_getdirs | ( | Tcl_Interp * | irp, | |
char * | dir | |||
) | [static] |
Definition at line 1153 of file filedb3.c.
References FILE_DIR, FILE_UNUSED, filedb_close(), filedb_getfile, filedb_open(), filedb_readtop(), filedb_entry::filename, free_fdbe(), GET_FILENAME, NULL, and filedb_entry::stat.
Referenced by tcl_getdirs().
01154 { 01155 FILE *fdb; 01156 filedb_entry *fdbe; 01157 01158 fdb = filedb_open(dir, 0); 01159 if (!fdb) 01160 return; 01161 filedb_readtop(fdb, NULL); 01162 while (!feof(fdb)) { 01163 fdbe = filedb_getfile(fdb, ftell(fdb), GET_FILENAME); 01164 if (fdbe) { 01165 if ((!(fdbe->stat & FILE_UNUSED)) && (fdbe->stat & FILE_DIR)) 01166 Tcl_AppendElement(irp, fdbe->filename); 01167 free_fdbe(&fdbe); 01168 } 01169 } 01170 filedb_close(fdb); 01171 }
static filedb_entry* filedb_getentry | ( | char * | dir, | |
char * | fn | |||
) | [static] |
Definition at line 638 of file filedb3.c.
References filedb_close(), filedb_matchfile, filedb_open(), filedb_readtop(), and NULL.
Referenced by filedb_getdesc(), filedb_getgots(), filedb_getowner(), and tcl_getflags().
00639 { 00640 FILE *fdb; 00641 filedb_entry *fdbe = NULL; 00642 00643 fdb = filedb_open(dir, 0); 00644 if (fdb) { 00645 filedb_readtop(fdb, NULL); 00646 fdbe = filedb_matchfile(fdb, ftell(fdb), fn); 00647 filedb_close(fdb); 00648 } 00649 return fdbe; 00650 }
static void filedb_getfiles | ( | Tcl_Interp * | irp, | |
char * | dir | |||
) | [static] |
Definition at line 1133 of file filedb3.c.
References FILE_DIR, FILE_UNUSED, filedb_close(), filedb_getfile, filedb_open(), filedb_readtop(), filedb_entry::filename, free_fdbe(), GET_FILENAME, NULL, and filedb_entry::stat.
Referenced by tcl_getfiles().
01134 { 01135 FILE *fdb; 01136 filedb_entry *fdbe; 01137 01138 fdb = filedb_open(dir, 0); 01139 if (!fdb) 01140 return; 01141 filedb_readtop(fdb, NULL); 01142 while (!feof(fdb)) { 01143 fdbe = filedb_getfile(fdb, ftell(fdb), GET_FILENAME); 01144 if (fdbe) { 01145 if (!(fdbe->stat & (FILE_DIR | FILE_UNUSED))) 01146 Tcl_AppendElement(irp, fdbe->filename); 01147 free_fdbe(&fdbe); 01148 } 01149 } 01150 filedb_close(fdb); 01151 }
static int filedb_getgots | ( | char * | dir, | |
char * | fn | |||
) | [static] |
Definition at line 1082 of file filedb3.c.
References filedb_getentry(), free_fdbe(), filedb_entry::gots, and NULL.
Referenced by tcl_getgots().
01083 { 01084 filedb_entry *fdbe = NULL; 01085 int gots = 0; 01086 01087 fdbe = filedb_getentry(dir, fn); 01088 if (fdbe) { 01089 gots = fdbe->gots; 01090 free_fdbe(&fdbe); 01091 } 01092 return gots; 01093 }
static void filedb_getowner | ( | char * | dir, | |
char * | fn, | |||
char ** | owner | |||
) | [static] |
Definition at line 1070 of file filedb3.c.
References filedb_getentry(), free_fdbe(), NULL, and filedb_entry::uploader.
Referenced by tcl_getowner().
01071 { 01072 filedb_entry *fdbe = NULL; 01073 01074 fdbe = filedb_getentry(dir, fn); 01075 if (fdbe) { 01076 *owner = strdup(fdbe->uploader); 01077 free_fdbe(&fdbe); 01078 } else 01079 *owner = NULL; 01080 }
static void filedb_initdb | ( | FILE * | fdb | ) | [static] |
Definition at line 654 of file filedb3.c.
References FILEDB_NEWEST_VER, filedb_writetop(), now, filedb_top::timestamp, and filedb_top::version.
Referenced by convert_old_db(), and convert_old_files().
00655 { 00656 filedb_top fdbt; 00657 00658 fdbt.version = FILEDB_NEWEST_VER; 00659 fdbt.timestamp = now; 00660 filedb_writetop(fdb, &fdbt); 00661 }
static void filedb_ls | ( | FILE * | fdb, | |
int | idx, | |||
char * | mask, | |||
int | showall | |||
) | [static] |
Definition at line 910 of file filedb3.c.
References _, filedb_entry::chan, filedb_entry::desc, FILE_DIR, FILE_HIDDEN, FILE_UNUSED, filedb_getfile, filedb_readtop(), filelist_add(), filelist_addout(), filelist_free(), filelist_idxshow(), filelist_new(), filelist_sort(), filedb_entry::filename, filedb_entry::flags_req, free_fdbe(), GET_FULL, filedb_entry::gots, NULL, P_, filedb_entry::size, filedb_entry::stat, filedb_entry::uploaded, filedb_entry::uploader, and wild_match_file().
Referenced by files_ls().
00911 { 00912 int ok = 0, cnt = 0, is = 0; 00913 char s1[81], *p = NULL; 00914 struct flag_record user = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0}; 00915 filedb_entry *fdbe = NULL; 00916 filelist_t *flist = NULL; 00917 00918 flist = filelist_new(); 00919 filedb_readtop(fdb, NULL); 00920 fdbe = filedb_getfile(fdb, ftell(fdb), GET_FULL); 00921 while (fdbe) { 00922 ok = 1; 00923 if (fdbe->stat & FILE_UNUSED) 00924 ok = 0; 00925 if (ok && (fdbe->stat & FILE_DIR) && fdbe->flags_req) { 00926 /* Check permissions */ 00927 struct flag_record req = {FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0}; 00928 00929 break_down_flags(fdbe->flags_req, &req, NULL); 00930 get_user_flagrec(dcc[idx].user, &user, dcc[idx].u.file->chat->con_chan); 00931 if (!flagrec_ok(&req, &user)) { 00932 ok = 0; 00933 } 00934 } 00935 if (ok) 00936 is = 1; 00937 if (ok && !wild_match_file(mask, fdbe->filename)) 00938 ok = 0; 00939 if (ok && (fdbe->stat & FILE_HIDDEN) && !(showall)) 00940 ok = 0; 00941 if (ok) { 00942 /* Display it! */ 00943 if (cnt == 0) { 00944 dprintf(idx, _("Filename Size Sent by/Date # Gets\n")); 00945 dprintf(idx, _("------------------------------ ---- ------------------- ------\n")); 00946 } 00947 filelist_add(flist, fdbe->filename); 00948 if (fdbe->stat & FILE_DIR) { 00949 char *s2 = NULL, *s3 = NULL; 00950 00951 /* Too long? */ 00952 if (strlen(fdbe->filename) > 45) { 00953 /* Display the filename on its own line. */ 00954 s2 = malloc(strlen(fdbe->filename) + 3); 00955 sprintf(s2, "%s/\n", fdbe->filename); 00956 filelist_addout(flist, s2); 00957 free_null(s2); 00958 } else { 00959 s2 = malloc(strlen(fdbe->filename) + 2); 00960 sprintf(s2, "%s/", fdbe->filename); 00961 } 00962 /* Note: You have to keep the sprintf and the malloc statements 00963 * in sync, i.e. always check that you allocate enough 00964 * memory. 00965 */ 00966 if ((fdbe->flags_req) && 00967 (user.global &(USER_MASTER | USER_JANITOR))) { 00968 s3 = malloc(42 + strlen(s2 ? s2 : "") + 6 + 00969 strlen(_("requires")) + strlen(fdbe->flags_req) + 1 + 00970 strlen(fdbe->chan ? fdbe->chan : "") + 1); 00971 sprintf(s3, "%-30s <DIR> (%s %s%s%s)\n", s2, _("requires"), 00972 fdbe->flags_req, fdbe->chan ? " " : "", 00973 fdbe->chan ? fdbe->chan : ""); 00974 } else { 00975 s3 = malloc(38 + strlen(s2 ? s2 : "")); 00976 sprintf(s3, "%-30s <DIR>\n", s2 ? s2 : ""); 00977 } 00978 if (s2) 00979 free_null(s2); 00980 filelist_addout(flist, s3); 00981 free_null(s3); 00982 } else { 00983 char s2[41], t[50], *s3 = NULL, *s4; 00984 00985 s2[0] = 0; 00986 if (showall) { 00987 if (fdbe->stat & FILE_HIDDEN) 00988 strcat(s2, " (hid)"); 00989 } 00990 strftime(t, 10, "%d%b%Y", localtime(&fdbe->uploaded)); 00991 if (fdbe->size < 1024) 00992 sprintf(s1, "%5d", fdbe->size); 00993 else 00994 sprintf(s1, "%4dk", (int) (fdbe->size / 1024)); 00995 /* Too long? */ 00996 if (strlen(fdbe->filename) > 30) { 00997 s3 = malloc(strlen(fdbe->filename) + 2); 00998 sprintf(s3, "%s\n", fdbe->filename); 00999 filelist_addout(flist, s3); 01000 free_null(s3); 01001 /* Causes filename to be displayed on its own line */ 01002 } else 01003 realloc_strcpy(s3, fdbe->filename); 01004 s4 = malloc(69 + strlen(s3 ? s3 : "") + strlen(s1) + 01005 strlen(fdbe->uploader) + strlen(t) + strlen(s2)); 01006 sprintf(s4, "%-30s %s %-9s (%s) %6d%s\n", s3 ? s3 : "", s1, 01007 fdbe->uploader, t, fdbe->gots, s2); 01008 if (s3) 01009 free_null(s3); 01010 filelist_addout(flist, s4); 01011 free_null(s4); 01012 } 01013 if (fdbe->desc) { 01014 p = strchr(fdbe->desc, '\n'); 01015 while (p != NULL) { 01016 *p = 0; 01017 if ((fdbe->desc)[0]) { 01018 char *sd; 01019 01020 sd = malloc(strlen(fdbe->desc) + 5); 01021 sprintf(sd, " %s\n", fdbe->desc); 01022 filelist_addout(flist, sd); 01023 free_null(sd); 01024 } 01025 strcpy(fdbe->desc, p + 1); 01026 p = strchr(fdbe->desc, '\n'); 01027 } 01028 if ((fdbe->desc)[0]) { 01029 char *sd; 01030 01031 sd = malloc(strlen(fdbe->desc) + 5); 01032 sprintf(sd, " %s\n", fdbe->desc); 01033 filelist_addout(flist, sd); 01034 free_null(sd); 01035 } 01036 } 01037 cnt++; 01038 } 01039 free_fdbe(&fdbe); 01040 fdbe = filedb_getfile(fdb, ftell(fdb), GET_FULL); 01041 } 01042 if (is == 0) 01043 dprintf(idx, _("No files in this directory.\n")); 01044 else if (cnt == 0) 01045 dprintf(idx, _("No matching files.\n")); 01046 else { 01047 filelist_sort(flist); 01048 filelist_idxshow(flist, idx); 01049 dprintf(idx, P_("--- %d file.\n", "--- %d files.\n", cnt), cnt); 01050 } 01051 filelist_free(flist); 01052 }
static void filedb_mergeempty | ( | FILE * | fdb | ) | [static] |
Definition at line 588 of file filedb3.c.
References filedb_entry::buf_len, FILE_UNUSED, filedb_getfile, filedb_readtop(), filedb_updatefile, free_fdbe(), GET_HEADER, NULL, filedb_entry::pos, filedb_entry::stat, and UPDATE_SIZE.
Referenced by filedb_open().
00589 { 00590 filedb_entry *fdbe_t, *fdbe_i; 00591 int modified; 00592 00593 filedb_readtop(fdb, NULL); 00594 while (!feof(fdb)) 00595 { 00596 fdbe_t = filedb_getfile(fdb, ftell(fdb), GET_HEADER); 00597 if (fdbe_t) { 00598 if (fdbe_t->stat & FILE_UNUSED) { 00599 modified = 0; 00600 fdbe_i = filedb_getfile(fdb, ftell(fdb), GET_HEADER); 00601 while (fdbe_i) { 00602 /* Is this entry in use? */ 00603 if (!(fdbe_i->stat & FILE_UNUSED)) 00604 break; /* It is, exit loop. */ 00605 00606 /* Woohoo, found an empty entry. Append it's space to 00607 * our target entry's buffer space. 00608 */ 00609 fdbe_t->buf_len += sizeof(filedb_header) + fdbe_i->buf_len; 00610 modified++; 00611 free_fdbe(&fdbe_i); 00612 /* Get next file entry */ 00613 fdbe_i = filedb_getfile(fdb, ftell(fdb), GET_HEADER); 00614 } 00615 00616 /* Did we exit the loop because of a used entry? */ 00617 if (fdbe_i) { 00618 free_fdbe(&fdbe_i); 00619 /* Did we find any empty entries before? */ 00620 if (modified) 00621 filedb_updatefile(fdb, fdbe_t->pos, fdbe_t, UPDATE_SIZE); 00622 /* ... or because we hit EOF? */ 00623 } else { 00624 /* Truncate trailing empty entries and exit. */ 00625 ftruncate(fileno(fdb), fdbe_t->pos); 00626 free_fdbe(&fdbe_t); 00627 return; 00628 } 00629 } 00630 free_fdbe(&fdbe_t); 00631 } 00632 } 00633 }
static FILE* filedb_open | ( | char * | path, | |
int | sort | |||
) | [static] |
Definition at line 778 of file filedb3.c.
References _, convert_old_db(), convert_old_files(), count, dccdir, filedb_mergeempty(), FILEDB_NEWEST_VER, filedb_path, filedb_readtop(), filedb_update(), filedb_writetop(), lockfile(), LOG_MISC, make_point_path(), now, NULL, putlog(), filedb_top::timestamp, unlockfile(), and filedb_top::version.
Referenced by add_file(), cmd_desc(), cmd_hide(), cmd_mkdir(), cmd_mv_cp(), cmd_optimize(), cmd_reget_get(), cmd_rm(), cmd_rmdir(), cmd_unhide(), filedb_change(), filedb_getdirs(), filedb_getentry(), filedb_getfiles(), filedb_setdesc(), filedb_setowner(), files_ls(), files_reget(), incr_file_gots(), resolve_dir(), tcl_mkdir(), tcl_mv_cp(), tcl_rmdir(), tcl_setflags(), and welcome_to_files().
00779 { 00780 char *s, *npath; 00781 FILE *fdb; 00782 filedb_top fdbt; 00783 struct stat st; 00784 00785 if (count >= 2) 00786 putlog(LOG_MISC, "*", "(@) warning: %d open filedb's", count); 00787 npath = malloc(strlen(dccdir) + strlen(path) + 1); 00788 simple_sprintf(npath, "%s%s", dccdir, path); 00789 /* Use alternate filename if requested */ 00790 if (filedb_path[0]) { 00791 char *s2; 00792 00793 s2 = make_point_path(path); 00794 s = malloc(strlen(filedb_path) + strlen(s2) + 8); 00795 simple_sprintf(s, "%sfiledb.%s", filedb_path, s2); 00796 free_null(s2); 00797 } else { 00798 s = malloc(strlen(npath) + 10); 00799 simple_sprintf(s, "%s/.filedb", npath); 00800 } 00801 fdb = fopen(s, "r+b"); 00802 if (!fdb) { 00803 if (convert_old_files(npath, s)) { 00804 fdb = fopen(s, "r+b"); 00805 if (fdb == NULL) { 00806 putlog(LOG_MISC, "*", _("(!) Broken convert to filedb in %s"), npath); 00807 free_null(s); 00808 free_null(npath); 00809 return NULL; 00810 } 00811 lockfile(fdb); 00812 filedb_update(npath, fdb, sort); 00813 count++; 00814 free_null(s); 00815 free_null(npath); 00816 return fdb; 00817 } else { 00818 filedb_top fdbt; 00819 00820 /* Create new database and fix it up */ 00821 fdb = fopen(s, "w+b"); 00822 if (!fdb) { 00823 free_null(s); 00824 free_null(npath); 00825 return NULL; 00826 } 00827 lockfile(fdb); 00828 fdbt.version = FILEDB_NEWEST_VER; 00829 fdbt.timestamp = now; 00830 filedb_writetop(fdb, &fdbt); 00831 filedb_update(npath, fdb, sort); 00832 count++; 00833 free_null(s); 00834 free_null(npath); 00835 return fdb; 00836 } 00837 } 00838 00839 lockfile(fdb); /* Lock it from other bots */ 00840 filedb_readtop(fdb, &fdbt); 00841 if (fdbt.version < FILEDB_NEWEST_VER) { 00842 if (!convert_old_db(&fdb, s)) { 00843 /* Conversion failed. Unlock file again and error out. 00844 * (convert_old_db() could have modified fdb, so check 00845 * for fdb != NULL.) 00846 */ 00847 if (fdb) 00848 unlockfile(fdb); 00849 free_null(npath); 00850 free_null(s); 00851 return NULL; 00852 } 00853 filedb_update(npath, fdb, sort); 00854 } 00855 stat(npath, &st); 00856 /* Update filedb if: 00857 * + it's been 6 hours since it was last updated 00858 * + the directory has been visibly modified since then 00859 * (6 hours may be a bit often) 00860 */ 00861 if (sort || ((now - fdbt.timestamp) > (6 * 3600)) || 00862 (fdbt.timestamp < st.st_mtime) || 00863 (fdbt.timestamp < st.st_ctime)) 00864 /* File database isn't up-to-date! */ 00865 filedb_update(npath, fdb, sort & 1); 00866 else if ((now - fdbt.timestamp) > 300) 00867 filedb_mergeempty(fdb); 00868 00869 count++; 00870 free_null(npath); 00871 free_null(s); 00872 return fdb; 00873 }
static int filedb_readtop | ( | FILE * | fdb, | |
filedb_top * | fdbt | |||
) | [static] |
Definition at line 210 of file filedb3.c.
Referenced by cmd_desc(), cmd_hide(), cmd_mkdir(), cmd_mv_cp(), cmd_reget_get(), cmd_rm(), cmd_rmdir(), cmd_unhide(), convert_old_db(), filedb_add(), filedb_change(), filedb_cleanup(), filedb_findempty(), filedb_getdirs(), filedb_getentry(), filedb_getfiles(), filedb_ls(), filedb_mergeempty(), filedb_open(), filedb_setdesc(), filedb_setowner(), filedb_timestamp(), filedb_update(), files_reget(), incr_file_gots(), resolve_dir(), tcl_mkdir(), tcl_mv_cp(), tcl_rmdir(), and tcl_setflags().
00211 { 00212 if (fdbt) { 00213 /* Read header */ 00214 fseek(fdb, 0L, SEEK_SET); 00215 if (feof(fdb)) 00216 return 0; 00217 fread(fdbt, 1, sizeof(filedb_top), fdb); 00218 } else 00219 fseek(fdb, sizeof(filedb_top), SEEK_SET); 00220 return 1; 00221 }
static void filedb_setdesc | ( | char * | dir, | |
char * | fn, | |||
char * | desc | |||
) | [static] |
Definition at line 1095 of file filedb3.c.
References filedb_entry::desc, filedb_close(), filedb_matchfile, filedb_open(), filedb_readtop(), filedb_updatefile, free_fdbe(), NULL, filedb_entry::pos, and UPDATE_ALL.
Referenced by tcl_setdesc().
01096 { 01097 filedb_entry *fdbe = NULL; 01098 FILE *fdb = NULL; 01099 01100 fdb = filedb_open(dir, 0); 01101 if (!fdb) 01102 return; 01103 filedb_readtop(fdb, NULL); 01104 fdbe = filedb_matchfile(fdb, ftell(fdb), fn); 01105 if (fdbe) { 01106 free_null(fdbe->desc); 01107 realloc_strcpy(fdbe->desc, desc); 01108 filedb_updatefile(fdb, fdbe->pos, fdbe, UPDATE_ALL); 01109 free_fdbe(&fdbe); 01110 } 01111 filedb_close(fdb); 01112 }
static void filedb_setowner | ( | char * | dir, | |
char * | fn, | |||
char * | owner | |||
) | [static] |
Definition at line 1114 of file filedb3.c.
References filedb_close(), filedb_matchfile, filedb_open(), filedb_readtop(), filedb_updatefile, free_fdbe(), NULL, filedb_entry::pos, UPDATE_ALL, and filedb_entry::uploader.
Referenced by tcl_setowner().
01115 { 01116 filedb_entry *fdbe = NULL; 01117 FILE *fdb = NULL; 01118 01119 fdb = filedb_open(dir, 0); 01120 if (!fdb) 01121 return; 01122 filedb_readtop(fdb, NULL); 01123 fdbe = filedb_matchfile(fdb, ftell(fdb), fn); 01124 if (fdbe) { 01125 free_null(fdbe->uploader); 01126 realloc_strcpy(fdbe->uploader, owner); 01127 filedb_updatefile(fdb, fdbe->pos, fdbe, UPDATE_ALL); 01128 free_fdbe(&fdbe); 01129 } 01130 filedb_close(fdb); 01131 }
static void filedb_timestamp | ( | FILE * | fdb | ) | [static] |
Definition at line 663 of file filedb3.c.
References filedb_readtop(), filedb_writetop(), now, and filedb_top::timestamp.
Referenced by filedb_close(), and filedb_update().
00664 { 00665 filedb_top fdbt; 00666 00667 filedb_readtop(fdb, &fdbt); 00668 fdbt.timestamp = now; 00669 filedb_writetop(fdb, &fdbt); 00670 }
static void filedb_update | ( | char * | path, | |
FILE * | fdb, | |||
int | sort | |||
) | [static] |
Definition at line 678 of file filedb3.c.
References _, dirent, FILE_DIR, FILE_UNUSED, filedb_addfile, filedb_cleanup(), filedb_delfile(), filedb_getfile, filedb_matchfile, filedb_readtop(), filedb_timestamp(), filedb_updatefile, free_fdbe(), GET_FILENAME, LOG_MISC, malloc_fdbe, now, NULL, putlog(), and UPDATE_HEADER.
Referenced by filedb_open().
00679 { 00680 struct dirent *dd = NULL; 00681 struct stat st; 00682 filedb_entry *fdbe = NULL; 00683 DIR *dir = NULL; 00684 long where = 0; 00685 char *name = NULL, *s = NULL; 00686 00687 /* 00688 * FIRST: make sure every real file is in the database 00689 */ 00690 dir = opendir(path); 00691 if (dir == NULL) { 00692 putlog(LOG_MISC, "*", _("filedb-update: cant open directory!")); 00693 return; 00694 } 00695 dd = readdir(dir); 00696 while (dd != NULL) { 00697 realloc_strcpy(name, dd->d_name); 00698 if (name[0] != '.') { 00699 s = malloc(strlen(path) + strlen(name) + 2); 00700 sprintf(s, "%s/%s", path, name); 00701 stat(s, &st); 00702 free_null(s); 00703 filedb_readtop(fdb, NULL); 00704 fdbe = filedb_matchfile(fdb, ftell(fdb), name); 00705 if (!fdbe) { 00706 /* new file! */ 00707 fdbe = malloc_fdbe(); 00708 realloc_strcpy(fdbe->filename, name); 00709 realloc_strcpy(fdbe->uploader, myname); 00710 fdbe->uploaded = now; 00711 fdbe->size = st.st_size; 00712 if (S_ISDIR(st.st_mode)) 00713 fdbe->stat |= FILE_DIR; 00714 filedb_addfile(fdb, fdbe); 00715 } else if (fdbe->size != st.st_size) { 00716 /* update size if needed */ 00717 fdbe->size = st.st_size; 00718 filedb_updatefile(fdb, fdbe->pos, fdbe, UPDATE_HEADER); 00719 } 00720 free_fdbe(&fdbe); 00721 } 00722 dd = readdir(dir); 00723 } 00724 if (name) 00725 free_null(name); 00726 closedir(dir); 00727 00728 /* 00729 * SECOND: make sure every db file is real 00730 */ 00731 filedb_readtop(fdb, NULL); 00732 fdbe = filedb_getfile(fdb, ftell(fdb), GET_FILENAME); 00733 while (fdbe) { 00734 where = ftell(fdb); 00735 if (!(fdbe->stat & FILE_UNUSED) && !(fdbe->stat & FILE_ISLINK) && 00736 fdbe->filename) { 00737 s = malloc(strlen(path) + 1 + strlen(fdbe->filename) + 1); 00738 sprintf(s, "%s/%s", path, fdbe->filename); 00739 if (stat(s, &st) != 0) 00740 /* gone file */ 00741 filedb_delfile(fdb, fdbe->pos); 00742 free_null(s); 00743 } 00744 free_fdbe(&fdbe); 00745 fdbe = filedb_getfile(fdb, where, GET_FILENAME); 00746 } 00747 00748 /* 00749 * THIRD: optimise database 00750 * 00751 * Instead of sorting, we only clean up the db, because sorting is now 00752 * done on-the-fly when we display the file list. 00753 */ 00754 if (sort) 00755 filedb_cleanup(fdb); /* Cleanup DB */ 00756 filedb_timestamp(fdb); /* Write new timestamp */ 00757 }
static int filedb_writetop | ( | FILE * | fdb, | |
filedb_top * | fdbt | |||
) | [static] |
Definition at line 225 of file filedb3.c.
Referenced by filedb_initdb(), filedb_open(), and filedb_timestamp().
00226 { 00227 fseek(fdb, 0L, SEEK_SET); 00228 fwrite(fdbt, 1, sizeof(filedb_top), fdb); 00229 return 1; 00230 }
static void free_fdbe | ( | filedb_entry ** | fdbe | ) | [static] |
Definition at line 140 of file filedb3.c.
Referenced by _filedb_matchfile(), _filedb_updatefile(), cmd_desc(), cmd_hide(), cmd_mkdir(), cmd_mv_cp(), cmd_reget_get(), cmd_rm(), cmd_rmdir(), cmd_unhide(), convert_old_files(), convert_version1(), convert_version2(), filedb_add(), filedb_change(), filedb_cleanup(), filedb_findempty(), filedb_getdesc(), filedb_getdirs(), filedb_getfiles(), filedb_getgots(), filedb_getowner(), filedb_ls(), filedb_mergeempty(), filedb_setdesc(), filedb_setowner(), filedb_update(), files_reget(), incr_file_gots(), resolve_dir(), tcl_getflags(), tcl_mkdir(), tcl_mv_cp(), tcl_rmdir(), and tcl_setflags().
00141 { 00142 if (!fdbe || !*fdbe) 00143 return; 00144 if ((*fdbe)->filename) 00145 free_null((*fdbe)->filename); 00146 if ((*fdbe)->desc) 00147 free_null((*fdbe)->desc); 00148 if ((*fdbe)->chan) 00149 free_null((*fdbe)->chan); 00150 if ((*fdbe)->uploader) 00151 free_null((*fdbe)->uploader); 00152 if ((*fdbe)->flags_req) 00153 free_null((*fdbe)->flags_req); 00154 free_null(*fdbe); 00155 }
static void lockfile | ( | FILE * | fdb | ) | [static] |
Definition at line 178 of file filedb3.c.
Referenced by convert_old_db(), convert_old_files(), and filedb_open().
00179 { 00180 struct flock fl; 00181 00182 fl.l_type = F_WRLCK; 00183 fl.l_start = 0; 00184 fl.l_whence = SEEK_SET; 00185 fl.l_len = 0; 00186 fcntl(fileno(fdb), F_SETLKW, &fl); 00187 }
static char* make_point_path | ( | char * | path | ) | [static] |
Definition at line 762 of file filedb3.c.
References NULL.
Referenced by filedb_open().
00763 { 00764 char *s2 = NULL, *p = NULL; 00765 00766 realloc_strcpy(s2, path); 00767 if (s2[strlen(s2) - 1] == '/') 00768 s2[strlen(s2) - 1] = 0; /* remove trailing '/' */ 00769 p = s2; 00770 while (*p++) 00771 if (*p == '/') 00772 *p = '.'; 00773 return s2; 00774 }
static void unlockfile | ( | FILE * | f | ) | [static] |
Definition at line 191 of file filedb3.c.
Referenced by convert_old_db(), convert_old_files(), filedb_close(), and filedb_open().
00192 { 00193 struct flock fl; 00194 00195 fl.l_type = F_UNLCK; 00196 fl.l_start = 0; 00197 fl.l_whence = SEEK_SET; 00198 fl.l_len = 0; 00199 fcntl(fileno(f), F_SETLKW, &fl); 00200 }
static int wild_match_file | ( | register char * | m, | |
register char * | n | |||
) | [static] |
Definition at line 80 of file filedb3.c.
References FILEMATCH, FILEQUOTE, FILEWILDQ, and FILEWILDS.
Referenced by _filedb_matchfile(), and filedb_ls().
00081 { 00082 char *ma = m, *lsm = 0, *lsn = 0; 00083 int match = 1; 00084 register unsigned int sofar = 0; 00085 00086 /* null strings should never match */ 00087 if ((m == 0) || (n == 0) || (!*n)) 00088 return 0; 00089 00090 while (*n) { 00091 switch (*m) { 00092 case 0: 00093 do 00094 m--; 00095 while ((m > ma) && (*m == '?')); 00096 if ((m > ma) ? ((*m == '*') && (m[-1] != FILEQUOTE)) : (*m == '*')) 00097 return FILEMATCH; 00098 break; 00099 case FILEWILDS: 00100 do 00101 m++; 00102 while (*m == FILEWILDS); 00103 lsm = m; 00104 lsn = n; 00105 match += sofar; 00106 sofar = 0; 00107 continue; 00108 case FILEWILDQ: 00109 m++; 00110 n++; 00111 continue; 00112 case FILEQUOTE: 00113 m++; 00114 } 00115 if (*m == *n) { 00116 m++; 00117 n++; 00118 sofar++; 00119 continue; 00120 } 00121 if (lsm) { 00122 n = ++lsn; 00123 m = lsm; 00124 sofar = 0; 00125 continue; 00126 } 00127 return 0; 00128 } 00129 while (*m == FILEWILDS) 00130 m++; 00131 return (*m) ? 0 : MATCH; 00132 }
int count = 0 [static] |
Definition at line 73 of file filedb3.c.
Referenced by filedb_close(), filedb_open(), my_perl_callbacker(), wild_match(), and wild_match_per().