diff options
-rw-r--r-- | ChangeLog | 15 | ||||
-rw-r--r-- | file.c | 16 | ||||
-rw-r--r-- | fm.h | 5 | ||||
-rw-r--r-- | main.c | 59 |
4 files changed, 67 insertions, 28 deletions
@@ -1,5 +1,18 @@ 2010-07-19 d+w3m@vdr.jp + * [w3m-dev 04321] Re: w3m's bugs from bugs.debian.org + * http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=185006#22 + * main.c (sig_chld): save exit code to d->err. + (addDownloadList): initialize d->running and d->err. + (DownloadListBuffer): check d->err. + + * fm.h (_DownloadList): add running and err. + + * file.c (save2tmp): check returned value of Strfputs(). + (doFileSave): exit code is depend on the returned value of save2tmp(). + +2010-07-19 d+w3m@vdr.jp + * [w3m-dev 04238] [patch] simple preserve space * rc.c: Introduce option simple_preserve_space. * fm.h: add global variable SimplePreserveSpace. @@ -8974,4 +8987,4 @@ a * [w3m-dev 03276] compile error on EWS4800 * release-0-2-1 * import w3m-0.2.1 -$Id: ChangeLog,v 1.1009 2010/07/19 09:00:34 htrb Exp $ +$Id: ChangeLog,v 1.1010 2010/07/19 11:45:23 htrb Exp $ @@ -1,4 +1,4 @@ -/* $Id: file.c,v 1.256 2010/07/19 09:00:34 htrb Exp $ */ +/* $Id: file.c,v 1.257 2010/07/19 11:45:24 htrb Exp $ */ #include "fm.h" #include <sys/types.h> #include "myctype.h" @@ -7761,7 +7761,13 @@ save2tmp(URLFile uf, char *tmpf) { Str buf = Strnew_size(SAVE_BUF_SIZE); while (UFread(&uf, buf, SAVE_BUF_SIZE)) { - Strfputs(buf, ff); + if (Strfputs(buf, ff) != buf->length) { + bcopy(env_bak, AbortLoading, sizeof(JMP_BUF)); + TRAP_OFF; + fclose(ff); + current_content_length = 0; + return -2; + } linelen += buf->length; showProgress(&linelen, &trbyte); } @@ -8090,16 +8096,20 @@ doFileSave(URLFile uf, char *defstr) flush_tty(); pid = fork(); if (!pid) { + int err; if ((uf.content_encoding != CMP_NOCOMPRESS) && AutoUncompress) { uncompress_stream(&uf, &tmpf); if (tmpf) unlink(tmpf); } setup_child(FALSE, 0, UFfileno(&uf)); - if (!save2tmp(uf, p) && PreserveTimestamp && uf.modtime != -1) + err = save2tmp(uf, p); + if (err == 0 && PreserveTimestamp && uf.modtime != -1) setModtime(p, uf.modtime); UFclose(&uf); unlink(lock); + if (err != 0) + exit(-err); exit(0); } addDownloadList(pid, uf.url, p, lock, current_content_length); @@ -1,4 +1,4 @@ -/* $Id: fm.h,v 1.139 2010/07/19 09:00:34 htrb Exp $ */ +/* $Id: fm.h,v 1.140 2010/07/19 11:45:24 htrb Exp $ */ /* * w3m: WWW wo Miru utility * @@ -517,7 +517,8 @@ typedef struct _DownloadList { char *lock; clen_t size; time_t time; - int ok; + int running; + int err; struct _DownloadList *next; struct _DownloadList *prev; } DownloadList; @@ -1,4 +1,4 @@ -/* $Id: main.c,v 1.260 2010/07/18 14:10:09 htrb Exp $ */ +/* $Id: main.c,v 1.261 2010/07/19 11:45:24 htrb Exp $ */ #define MAINPROGRAM #include "fm.h" #include <signal.h> @@ -323,21 +323,26 @@ static void sig_chld(int signo) { int p_stat; -#ifdef HAVE_WAITPID pid_t pid; +#ifdef HAVE_WAITPID while ((pid = waitpid(-1, &p_stat, WNOHANG)) > 0) { - ; - } #elif HAVE_WAIT3 - int pid; - while ((pid = wait3(&p_stat, WNOHANG, NULL)) > 0) { - ; - } #else - wait(&p_stat); + if ((pid = wait(&p_stat)) > 0) { #endif + DownloadList *d; + + if (WIFEXITED(p_stat)) { + for (d = FirstDL; d != NULL; d = d->next) { + if (d->pid == pid) { + d->err = WEXITSTATUS(p_stat); + break; + } + } + } + } mySignal(SIGCHLD, sig_chld); return; } @@ -6348,7 +6353,8 @@ addDownloadList(pid_t pid, char *url, char *save, char *lock, clen_t size) d->lock = lock; d->size = size; d->time = time(0); - d->ok = FALSE; + d->running = TRUE; + d->err = 0; d->next = NULL; d->prev = LastDL; if (LastDL) @@ -6368,7 +6374,7 @@ checkDownloadList(void) if (!FirstDL) return FALSE; for (d = FirstDL; d != NULL; d = d->next) { - if (!d->ok && !lstat(d->lock, &st)) + if (d->running && !lstat(d->lock, &st)) return TRUE; } return FALSE; @@ -6408,15 +6414,16 @@ DownloadListBuffer(void) "<form method=internal action=download><hr>\n"); for (d = LastDL; d != NULL; d = d->prev) { if (lstat(d->lock, &st)) - d->ok = TRUE; + d->running = FALSE; Strcat_charp(src, "<pre>\n"); Strcat(src, Sprintf("%s\n --> %s\n ", html_quote(d->url), html_quote(conv_from_system(d->save)))); duration = cur_time - d->time; if (!stat(d->save, &st)) { size = st.st_size; - if (d->ok) { - d->size = size; + if (!d->running) { + if (!d->err) + d->size = size; duration = st.st_mtime - d->time; } } @@ -6435,7 +6442,7 @@ DownloadListBuffer(void) Strcat_char(src, '_'); Strcat_char(src, '\n'); } - if (!d->ok && size < d->size) + if ((d->running || d->err) && size < d->size) Strcat(src, Sprintf(" %s / %s bytes (%d%%)", convert_size3(size), convert_size3(d->size), (int)(100.0 * size / d->size))); @@ -6446,20 +6453,28 @@ DownloadListBuffer(void) Strcat(src, Sprintf(" %02d:%02d:%02d rate %s/sec", duration / (60 * 60), (duration / 60) % 60, duration % 60, convert_size(rate, 1))); - if (!d->ok && size < d->size && rate) { + if (d->running && size < d->size && rate) { eta = (d->size - size) / rate; Strcat(src, Sprintf(" eta %02d:%02d:%02d", eta / (60 * 60), (eta / 60) % 60, eta % 60)); } } Strcat_char(src, '\n'); - if (d->ok) { + if (!d->running) { Strcat(src, Sprintf("<input type=submit name=ok%d value=OK>", d->pid)); - if (size < d->size) - Strcat_charp(src, " Download incompleted"); - else - Strcat_charp(src, " Download completed"); + switch (d->err) { + case 0: if (size < d->size) + Strcat_charp(src, " Download ended but probably not complete"); + else + Strcat_charp(src, " Download complete"); + break; + case 1: Strcat_charp(src, " Error: could not open destination file"); + break; + case 2: Strcat_charp(src, " Error: could not write to file (disk full)"); + break; + default: Strcat_charp(src, " Error: unknown reason"); + } } else Strcat(src, Sprintf("<input type=submit name=stop%d value=STOP>", @@ -6513,7 +6528,7 @@ stopDownload(void) if (!FirstDL) return; for (d = FirstDL; d != NULL; d = d->next) { - if (d->ok) + if (!d->running) continue; #ifndef __MINGW32_VERSION kill(d->pid, SIGKILL); |