w3m

Unnamed repository; edit this file to name it for gitweb.
git clone https://logand.com/git/w3m.git/
Log | Files | Refs | README

commit f8f807615d59cae7c49a78669a51650b6ea52b65
parent e00e030e951d967a44e1d6803bf035ced931f742
Author: htrb <htrb>
Date:   Mon, 19 Jul 2010 11:45:23 +0000

* [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().

Diffstat:
MChangeLog | 13+++++++++++++
Mfile.c | 14++++++++++++--
Mfm.h | 3++-
Mmain.c | 57++++++++++++++++++++++++++++++++++++---------------------
4 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/ChangeLog b/ChangeLog @@ -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. diff --git a/file.c b/file.c @@ -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); diff --git a/fm.h b/fm.h @@ -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; diff --git a/main.c b/main.c @@ -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 --&gt; %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);