Bladeren bron

Create all files of a torrent at startup.

master
Richard Nyberg 18 jaren geleden
bovenliggende
commit
b0b50e29b6
1 gewijzigde bestanden met toevoegingen van 11 en 18 verwijderingen
  1. +11
    -18
      btpd/content.c

+ 11
- 18
btpd/content.c Bestand weergeven

@@ -106,7 +106,7 @@ static int
fd_cb_wr(const char *path, int *fd, void *arg) fd_cb_wr(const char *path, int *fd, void *arg)
{ {
struct torrent *tp = arg; struct torrent *tp = arg;
return vopen(fd, O_RDWR|O_CREAT, "%s/%s", tp->tl->dir, path); return vopen(fd, O_RDWR, "%s/%s", tp->tl->dir, path);
} }


static void static void
@@ -576,6 +576,7 @@ struct rstat {
int int
stat_and_adjust(struct torrent *tp, struct rstat ret[]) stat_and_adjust(struct torrent *tp, struct rstat ret[])
{ {
int fd;
char path[PATH_MAX]; char path[PATH_MAX];
struct stat sb; struct stat sb;
for (int i = 0; i < tp->nfiles; i++) { for (int i = 0; i < tp->nfiles; i++) {
@@ -583,24 +584,19 @@ stat_and_adjust(struct torrent *tp, struct rstat ret[])
again: again:
if (stat(path, &sb) == -1) { if (stat(path, &sb) == -1) {
if (errno == ENOENT) { if (errno == ENOENT) {
ret[i].mtime = -1; errno = vopen(&fd, O_CREAT|O_RDWR, "%s", path);
ret[i].size = -1; if (errno != 0 || close(fd) != 0)
return errno;
goto again;
} else } else
return errno; return errno;
} else { } else if (sb.st_size > tp->files[i].length) {
ret[i].mtime = sb.st_mtime;
ret[i].size = sb.st_size;
}
if (ret[i].size > tp->files[i].length) {
if (truncate(path, tp->files[i].length) != 0) if (truncate(path, tp->files[i].length) != 0)
return errno; return errno;
goto again; goto again;
} else if (ret[i].size == -1 && tp->files[i].length == 0) { } else {
int fd; ret[i].mtime = sb.st_mtime;
errno = vopen(&fd, O_CREAT|O_RDWR, "%s", path); ret[i].size = sb.st_size;
if (errno != 0 || close(fd) != 0)
return errno;
goto again;
} }
} }
return 0; return 0;
@@ -688,10 +684,7 @@ cm_td_start(struct cm_op *op)
uint32_t start, end; uint32_t start, end;
end = (off + tp->files[i].length - 1) end = (off + tp->files[i].length - 1)
/ tp->piece_length; / tp->piece_length;
if (sbs[i].size == -1) start = (off + sbs[i].size) / tp->piece_length;
start = off / tp->piece_length;
else
start = (off + sbs[i].size) / tp->piece_length;
while (start <= end) { while (start <= end) {
clear_bit(cm->pos_field, start); clear_bit(cm->pos_field, start);
clear_bit(cm->piece_field, start); clear_bit(cm->piece_field, start);


||||||
x
 
000:0
Laden…
Annuleren
Opslaan