--- uudeview-0.5.20.orig/uulib/uulib.c +++ uudeview-0.5.20/uulib/uulib.c @@ -872,7 +872,10 @@ } /* - * decode file first to temp file, then copy it to a final location + * Decode file first to temp file, then copy it to a final location. + * A move is preferable to a copy. If the file is on the same + * partition, no copy is performed. This is important for large + * files. */ int UUEXPORT @@ -978,6 +981,12 @@ return UURET_IOERR; } + if (rename(thefile->binfile, uugen_fnbuffer) == 0) { + fclose(source); + close(fildes); + goto finish_ok; + } + if ((target = fdopen (fildes, "wb")) == NULL) { progress.action = 0; UUMessage (uulib_id, __LINE__, UUMSG_ERROR, @@ -1042,6 +1051,8 @@ thefile->binfile, strerror (uu_errno = errno)); } + + finish_ok: _FP_free (thefile->binfile); thefile->binfile = NULL; thefile->state &= ~UUFILE_TMPFILE; @@ -1103,9 +1114,9 @@ while (!feof (inpfile) && (uu_fast_scanning || ftell(inpfile) < maxpos)) { - if (_FP_fgets (uugen_inbuffer, 511, inpfile) == NULL) + if (_FP_fgets (uugen_inbuffer, 1023, inpfile) == NULL) break; - uugen_inbuffer[511] = '\0'; + uugen_inbuffer[1023] = '\0'; if (ferror (inpfile)) break; --- uudeview-0.5.20.orig/uulib/uuscan.c +++ uudeview-0.5.20/uulib/uuscan.c @@ -387,10 +387,10 @@ *attribute != '(' && *attribute != ')' && *attribute != '<' && *attribute != '>' && *attribute != '@' && *attribute != ',' && - /* *attribute != ';' && */ *attribute != ':' && - *attribute != '\\' &&*attribute != '"' && - *attribute != '/' && /* *attribute != '[' && - *attribute != ']' && */ *attribute != '?' && + *attribute != ';' && *attribute != ':' && + *attribute != '\\' && *attribute != '"' && + *attribute != '/' && *attribute != '[' && + *attribute != ']' && *attribute != '?' && *attribute != '=' && length < 255) { *ptr++ = *attribute++; length++; --- uudeview-0.5.20.orig/uulib/uustring.h +++ uudeview-0.5.20/uulib/uustring.h @@ -36,3 +36,4 @@ #define S_MIME_B_NOT_FOUND 35 #define S_MIME_MULTI_DEPTH 36 #define S_MIME_PART_MULTI 37 +#define S_OPEN_FILE 38 --- uudeview-0.5.20.orig/uulib/uunconc.c +++ uudeview-0.5.20/uulib/uunconc.c @@ -1311,6 +1311,12 @@ char *mode, *ntmp; uufile *iter; size_t bytes; +#define HAVE_MKSTEMP +#ifdef HAVE_MKSTEMP + int tmpfd; + const char *tmpprefix = "uuXXXXXX"; + char *tmpdir = NULL; +#endif /* HAVE_MKSTEMP */ if (data == NULL || data->thisfile == NULL) return UURET_ILLVAL; @@ -1325,17 +1331,39 @@ return UURET_NODATA; if (data->uudet == PT_ENCODED) - mode = "wt"; /* open text files in text mode */ + mode = "wtx"; /* open text files in text mode */ else - mode = "wb"; /* otherwise in binary */ + mode = "wbx"; /* otherwise in binary */ +#ifdef HAVE_MKSTEMP + if ((getuid()==geteuid()) && (getgid()==getegid())) { + tmpdir=getenv("TMPDIR"); + } + + if (!tmpdir) { + tmpdir = "/tmp"; + } + data->binfile = malloc(strlen(tmpdir)+strlen(tmpprefix)+2); + + if (!data->binfile) { +#else if ((data->binfile = tempnam (NULL, "uu")) == NULL) { +#endif /* HAVE_MKSTEMP */ UUMessage (uunconc_id, __LINE__, UUMSG_ERROR, uustring (S_NO_TEMP_NAME)); return UURET_NOMEM; } +#ifdef HAVE_MKSTEMP + strcpy(data->binfile, tmpdir); + strcat(data->binfile, "/"); + strcat(data->binfile, tmpprefix); + + if ((tmpfd = mkstemp(data->binfile)) == -1 || + (dataout = fdopen(tmpfd, mode)) == NULL) { +#else if ((dataout = fopen (data->binfile, mode)) == NULL) { +#endif /* HAVE_MKSTEMP */ /* * we couldn't create a temporary file. Usually this means that TMP * and TEMP aren't set @@ -1343,6 +1371,12 @@ UUMessage (uunconc_id, __LINE__, UUMSG_ERROR, uustring (S_WR_ERR_TARGET), data->binfile, strerror (uu_errno = errno)); +#ifdef HAVE_MKSTEMP + if (tmpfd != -1) { + unlink(data->binfile); + close(tmpfd); + } +#endif /* HAVE_MKSTEMP */ _FP_free (data->binfile); data->binfile = NULL; uu_errno = errno; @@ -1437,6 +1471,9 @@ res = UURET_IOERR; break; } + UUMessage (uunconc_id, __LINE__, UUMSG_MESSAGE, + uustring (S_OPEN_FILE), + iter->data->sfname); _FP_strncpy (uugen_fnbuffer, iter->data->sfname, 1024); } @@ -1496,13 +1533,19 @@ */ if (data->uudet == BH_ENCODED && data->binfile) { +#ifdef HAVE_MKSTEMP + ntmp = malloc(strlen(tmpdir)+strlen(tmpprefix)+2); + + if (ntmp == NULL) { +#else if ((ntmp = tempnam (NULL, "uu")) == NULL) { +#endif /* HAVE_MKSTEMP */ UUMessage (uunconc_id, __LINE__, UUMSG_ERROR, uustring (S_NO_TEMP_NAME)); progress.action = 0; return UURET_NOMEM; } - if ((datain = fopen (data->binfile, "rb")) == NULL) { + if ((datain = fopen (data->binfile, "rbx")) == NULL) { UUMessage (uunconc_id, __LINE__, UUMSG_ERROR, uustring (S_NOT_OPEN_FILE), data->binfile, strerror (uu_errno = errno)); @@ -1510,12 +1553,27 @@ free (ntmp); return UURET_IOERR; } + +#ifdef HAVE_MKSTEMP + strcpy(ntmp, tmpdir); + strcat(ntmp, "/"); + strcat(ntmp, tmpprefix); + if ((tmpfd = mkstemp(ntmp)) == -1 || + (dataout = fdopen(tmpfd, "wb")) == NULL) { +#else if ((dataout = fopen (ntmp, "wb")) == NULL) { +#endif /* HAVE_MKSTEMP */ UUMessage (uunconc_id, __LINE__, UUMSG_ERROR, uustring (S_NOT_OPEN_TARGET), ntmp, strerror (uu_errno = errno)); progress.action = 0; fclose (datain); +#ifdef HAVE_MKSTEMP + if (tmpfd != -1) { + unlink(ntmp); + close(tmpfd); + } +#endif /* HAVE_MKSTEMP */ free (ntmp); return UURET_IOERR; } --- uudeview-0.5.20.orig/uulib/uustring.c +++ uudeview-0.5.20/uulib/uustring.c @@ -107,6 +107,7 @@ { S_MIME_B_NOT_FOUND, "Boundary expected on Multipart message but found EOF" }, { S_MIME_MULTI_DEPTH, "Multipart message nested too deep" }, { S_MIME_PART_MULTI, "Handling partial multipart message as plain text" }, + { S_OPEN_FILE, "Opened file %s" }, { 0, "" } }; --- uudeview-0.5.20.orig/unix/uudeview.c +++ uudeview-0.5.20/unix/uudeview.c @@ -443,18 +443,46 @@ FILE *target; size_t bytes; int res; +#define HAVE_MKSTEMP +#ifdef HAVE_MKSTEMP + int tmpfd; + const char *tmpprefix = "uuXXXXXX"; + char *tmpdir = NULL; +#endif /* HAVE_MKSTEMP */ if (stdinput) { fprintf (stderr, "proc_stdin: cannot process stdin twice\n"); return 0; } +#ifdef HAVE_MKSTEMP + if ((getuid()==geteuid()) && (getgid()==getegid())) { + tmpdir=getenv("TMPDIR"); + } + + if (!tmpdir) { + tmpdir = "/tmp"; + } + stdfile = malloc(strlen(tmpdir)+strlen(tmpprefix)+2); + + if (!stdfile) { +#else if ((stdfile = tempnam (NULL, "uu")) == NULL) { +#endif fprintf (stderr, "proc_stdin: cannot get temporary file\n"); return 0; } - if ((target = fopen (stdfile, "wb")) == NULL) { +#ifdef HAVE_MKSTEMP + strcpy(stdfile, tmpdir); + strcat(stdfile, "/"); + strcat(stdfile, tmpprefix); + + if ((tmpfd = mkstemp(stdfile)) == -1 || + (target = fdopen(tmpfd, "wbx")) == NULL) { +#else + if ((target = fopen (stdfile, "wbx")) == NULL) { +#endif fprintf (stderr, "proc_stdin: cannot open temp file %s for writing: %s\n", stdfile, strerror (errno)); _FP_free (stdfile); @@ -657,9 +685,6 @@ else switch (*(argv[number] + 1)) { case '\0': interact = 0; - if (overwrite == 0) { - overwrite = 1; - } proc_stdin (); break; case 'a': @@ -699,10 +724,7 @@ fprintf (stderr, "WARNING: cannot interact when reading from stdin\n"); } else { - interact = (*argv[number] == '+') ? 1 : 0; - if (overwrite == 0 && *argv[number] == '-') { - overwrite = 1; - } + interact = (*argv[number] == '+') ? 1 : 0; } break; case 'm': @@ -773,6 +795,8 @@ break; } } + if (overwrite == 0 && interact == 0 && autoren == 0) + overwrite = 1; return 1; } --- uudeview-0.5.20.orig/man/uudeview.1 +++ uudeview-0.5.20/man/uudeview.1 @@ -164,6 +164,16 @@ verbosity. Normally, the program prints some status messages while reading the input files, which can be very helpful if something should go wrong. Use if these messages disturb you. +Disables progress bars. See +.B -n +option. +.TP +.B -v +(disables Verbosity) Disables verbose messages, i.e. notes are not +displayed, but does not remove warnings and errors. Is not as quiet as +the +.B -q +(Quiet) option. .TP .B -n No progress bars. Normally, UUDeview prints ASCII bars crawling up --- uudeview-0.5.20.orig/tcl/xdeview +++ uudeview-0.5.20/tcl/xdeview @@ -59,8 +59,8 @@ # MIME configuration # -ifndef MIMEGlobalTypes "" -ifndef MIMEGlobalCap "" +ifndef MIMEGlobalTypes "/etc/mime.types" +ifndef MIMEGlobalCap "/etc/mailcap" if { ! [ catch { set env(HOME) } ] } { ifndef MIMELocalTypes $env(HOME)/.mime.types ifndef MIMELocalCap $env(HOME)/.mailcap --- uudeview-0.5.20.orig/man/uuwish.1 +++ uudeview-0.5.20/man/uuwish.1 @@ -0,0 +1,45 @@ +.\" Copyright (c) 1999 Roland Rosenfeld +.\" changes Copyright (c) 2001 Chris Hanson +.\" +.\" This program is free software; you can redistribute it and/or modify +.\" it under the terms of the GNU General Public License as published by +.\" the Free Software Foundation; either version 2 of the License, or +.\" (at your option) any later version. +.\" +.\" This program is distributed in the hope that it will be useful, +.\" but WITHOUT ANY WARRANTY; without even the implied warranty of +.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +.\" GNU General Public License for more details. +.\" +.\" You should have received a copy of the GNU General Public License +.\" along with this program; if not, write to the Free Software +.\" Foundation, Inc.,59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +.\" +.\" This manual page is written especially for Debian Linux. +.\" +.TH UUWISH 1 "February 2001" "Debian Project" "Debian GNU/Linux" +.SH NAME +uuwish \- A minimal wish extended by the UU commands +.SH SYNOPSIS +.B uuwish +is a minimal +.BR wish (1) +extended by the UU commands that are available in +.BR uudeview (1) +and +.BR uuenview (1). +.B uuwish +isn't meant to be called directly; it is a Tcl/Tk script interpreter, +which is meant to be used by +.BR xdeview (1). +.SH "SEE ALSO" +.BR xdeview (1), +.BR uudeview (1), +.BR uuenview (1), +.BR wish (1). +.SH AUTHOR +.B uuwish +was written by Frank Pilhofer . +.PP +This manual page was written by Roland Rosenfeld , +for the Debian GNU/Linux system (but may be used by others).