x <<= bitcount;
if (compsize < origsize) {
if (fwrite(&subbitbuf, 1, 1, outfile) == 0) {
- /* fileerror(WTERR, outfile); */
- fatal_error("Write error in crcio.c(putcode)\n");
- /* exit(errno); */
+ fatal_error("Write error in crcio.c(putcode)");
}
compsize++;
}
x <<= bitcount;
if (compsize < origsize) {
if (fwrite(&subbitbuf, 1, 1, outfile) == 0) {
- /* fileerror(WTERR, outfile); */
- fatal_error("Write error in crcio.c(putbits)\n");
- /* exit(errno); */
+ fatal_error("Write error in crcio.c(putbits)");
}
compsize++;
}
if (fp) {
if (text_mode) {
if (fwrite_txt(p, n, fp))
- fatal_error("File write error\n");
+ fatal_error("File write error");
}
else {
if (fwrite(p, 1, n, fp) < n)
- fatal_error("File write error\n");
+ fatal_error("File write error");
}
}
}
/* ------------------------------------------------------------------------ */
#ifdef EUC
-void
+int
putc_euc(c, fd)
int c;
FILE *fd;
if (putc_euc_cache == EOF) {
if (!euc_mode || c < 0x81 || c > 0xFC) {
- putc(c, fd);
- return;
+ return putc(c, fd);
}
if (c >= 0xA0 && c < 0xE0) {
- putc(0x8E, fd); /* single shift */
- putc(c, fd);
- return;
+ if (putc(0x8E, fd) == EOF) return EOF; /* single shift */
+ return putc(c, fd);
}
putc_euc_cache = c; /* save first byte */
return;
c -= 0x1F;
d = (d - 0x81) * 2 + 0x21;
}
- putc(0x80 | d, fd);
- putc(0x80 | c, fd);
+ if (putc(0x80 | d, fd) == EOF) return EOF;
+ return putc(0x80 | c, fd);
}
#endif
while (--n >= 0) {
if (*p != '\015' && *p != '\032') {
#ifdef EUC
- putc_euc(*p, fp);
+ if (putc_euc(*p, fp) == EOF)
+ break;
#else
- putc(*p, fp);
+ if (putc(*p, fp) == EOF)
+ break;
#endif
}
}
if (hdr->header_level >= 3) {
- fatal_error("Unknown level header");
+ fatal_error("Unknown level header (level %d)", hdr->header_level);
return FALSE;
}
if ((hdr->header_level = get_byte()) != 2) {
if (calc_sum(data + I_METHOD, header_size) != checksum)
- warning("Checksum error (LHarc file?)", "");
+ warning("Checksum error (LHarc file?)");
name_length = get_byte();
for (i = 0; i < name_length; i++)
hdr->name[i] = (char) get_byte();
hdr->extend_type = EXTEND_GENERIC;
hdr->has_crc = FALSE;
} else {
- fatal_error("Unkonwn header (lha file?)");
- return FALSE;
+ error("Unkonwn header (lha file?)");
+ exit(1);
}
} else {
hdr->has_crc = TRUE;
#ifdef S_IFLNK
if (is_symlink(v_stat)) {
- char lkname[257];
+ char lkname[256]; /* FIXME: no enough space */
int len;
bcopy(LZHDIRS_METHOD, hdr->method, METHOD_TYPE_STRAGE);
hdr->attribute = GENERIC_DIRECTORY_ATTRIBUTE;
hdr->original_size = 0;
- len = readlink(name, lkname, 256);
- lkname[len] = (char)'\0';
- sprintf(hdr->name, "%s|%s", hdr->name, lkname);
+ len = readlink(name, lkname, sizeof(lkname));
+ if (xsnprintf(hdr->name, sizeof(hdr->name),
+ "%s|%.*s", hdr->name, len, lkname) == -1)
+ error("file name is too long (%s -> %.*s)", hdr->name, len, lkname);
}
#endif
put_word(hcrc);
}
- if (fwrite(data, sizeof(char), header_size + 2, nafp) == 0)
+ if (fwrite(data, header_size + 2, 1, nafp) == 0)
fatal_error("Cannot write to temporary file");
filename_conv(hdr->name, strlen(hdr->name), sizeof(hdr->name),
EXTERN int cmd_filec;
EXTERN char *archive_name;
-EXTERN char expanded_archive_name[FILENAME_LENGTH];
EXTERN char temporary_name[FILENAME_LENGTH];
EXTERN char backup_archive_name[FILENAME_LENGTH];
extern void interrupt();
-extern void message();
-extern void warning();
-extern void error();
-extern void fatal_error();
+extern void message(char *fmt, ...);
+extern void warning(char *fmt, ...);
+extern void error(char *fmt, ...);
+extern void fatal_error(char *fmt, ...);
extern boolean need_file();
extern int inquire();
void euc2sjis(int *p1, int *p2);
void sjis2euc(int *p1, int *p2);
+/* from util.c */
+int xsnprintf(char *dest, size_t size, char *fmt, ...);
+
+
/* Local Variables: */
/* mode:c */
/* tab-width:4 */
boolean directory, symlink;
if (GETSTAT(name, &stbuf) < 0) {
- error("Cannot access", name); /* See cleaning_files, Why? */
+ error("Cannot access file \"%s\"", name); /* See cleaning_files, Why? */
return oafp;
}
fseek(oafp, ahdr.packed_size, SEEK_CUR);
if (noexec || !quiet)
if (b2 != NULL)
- printf("delete %s -> %s\n", b1, b2);
+ message("delete %s -> %s", b1, b2);
else
- printf("delete %s\n", b1);
+ message("delete %s", b1);
}
else { /* copy */
if (noexec) {
remove_temporary_at_error = TRUE;
temporary_fd = build_temporary_name();
if (temporary_fd == -1)
- fatal_error(temporary_name);
+ fatal_error("Cannot open temporary file \"%s\"", temporary_name);
afp = fdopen(temporary_fd, WRITE_BINARY);
if (afp == NULL)
- fatal_error(temporary_name);
+ fatal_error("Cannot open temporary file \"%s\"", temporary_name);
return afp;
}
if (unlink(backup_archive_name) < 0 ||
rename(archive_name, backup_archive_name) < 0)
#endif
- fatal_error(archive_name);
+ fatal_error("Cannot make backup file \"%s\"", archive_name);
}
recover_archive_when_interrupt = TRUE;
signal(SIGINT, interrupt);
{
if (!quiet && new_archive_name == new_archive_name_buffer) {
/* warning at old archive is SFX */
- fprintf(stderr, "New archive file is \"%s\"\n", new_archive_name);
+ message("New archive file is \"%s\"", new_archive_name);
}
}
char **filev;
if (GETSTAT(name, &stbuf) < 0) {
- warning("Cannot access", name);
+ warning("Cannot access \"%s\": %s", name, strerror(errno));
}
else if (is_directory(&stbuf)) {
if (find_files(name, &filec, &filev)) {
free_files(filec, filev);
}
else
- warning("Cannot open directory", name);
+ warning("Cannot open directory \"%s\"", name);
if (noexec)
- printf("REMOVE DIRECTORY %s\n", name);
+ message("REMOVE DIRECTORY %s", name);
else if (rmdir(name) < 0)
- warning("Cannot remove directory", name);
+ warning("Cannot remove directory \"%s\"", name);
else if (verbose)
- printf("Removed %s.\n", name);
+ message("Removed %s.", name);
}
else if (is_regularfile(&stbuf)) {
if (noexec)
- printf("REMOVE FILE %s.\n", name);
+ message("REMOVE FILE %s.", name);
else if (unlink(name) < 0)
- warning("Cannot remove", name);
+ warning("Cannot remove \"%s\"", name);
else if (verbose)
- printf("Removed %s.\n", name);
+ message("Removed %s.", name);
}
#ifdef S_IFLNK
else if (is_symlink(&stbuf)) {
else if (unlink(name) < 0)
warning("Cannot remove", name);
else if (verbose)
- printf("Removed %s.\n", name);
+ message("Removed %s.", name);
}
#endif
else {
- error("Cannot remove (not a file or directory)", name);
+ error("Cannot remove file \"%s\" (not a file or directory)", name);
}
}
/* exit if no operation */
if (!update_if_newer && cmd_filec == 0) {
- error("No files given in argument, do nothing.", "");
- return;
+ error("No files given in argument, do nothing.");
+ exit(1);
}
/* open old archive if exist */
else
old_archive_exist = TRUE;
- if (update_if_newer && cmd_filec == 0 && !oafp)
- fatal_error(archive_name); /* exit if cannot execute
- * automatic update */
- errno = 0;
+ if (update_if_newer && cmd_filec == 0) {
+ warning("No files given in argument");
+ if (!oafp) {
+ error("archive file \"%s\" does not exists.",
+ archive_name);
+ exit(1);
+ }
+ }
if (new_archive && old_archive_exist) {
fclose(oafp);
/* open old archive if exist */
if ((oafp = open_old_archive()) == NULL)
- fatal_error(archive_name);
- errno = 0;
+ fatal_error("Cannot open archive file \"%s\"", archive_name);
/* exit if no operation */
if (cmd_filec == 0) {
fclose(oafp);
- warning("No files given in argument, do nothing.", "");
+ warning("No files given in argument, do nothing.");
return;
}
/* 1999.5.24 t.oka */
if(!noexec && new_archive_size <= 1){
unlink(temporary_name);
- fprintf(stderr, "New archive file \"%s\" is not created because it would be empty.\n", new_archive_name);
+ warning("New archive file \"%s\" is not created because it would be empty.", new_archive_name);
return;
}
#include "lha.h"
+#include <stdarg.h>
+
/* ------------------------------------------------------------------------ */
/* PROGRAM */
/* ------------------------------------------------------------------------ */
int cmd_filec;
char *archive_name;
-char expanded_archive_name[FILENAME_LENGTH];
char temporary_name[FILENAME_LENGTH];
char backup_archive_name[FILENAME_LENGTH];
#endif
break;
#endif
default:
- fprintf(stderr, "LHa: error option o%c\n", *p);
+ error("invalid compression method 'o%c'", *p);
exit(1);
}
break;
header_level = HEADER_LEVEL2;
break;
default:
- fprintf(stderr, "LHa: Unknown option '%c'.\n", p[-1]);
+ error("Unknown option '%c'.", p[-1]);
exit(1);
}
}
fprintf(stderr, "%s\n", LHA_VERSION);
}
-/* ------------------------------------------------------------------------ */
-static void
-message_1(title, subject, name)
- char *title, *subject, *name;
+void
+message(char *fmt, ...)
{
- fprintf(stderr, "LHa: %s%s ", title, subject);
- fflush(stderr);
+ int errno_sv = errno;
+ va_list v;
- if (errno == 0)
- fprintf(stderr, "%s\n", name);
- else
- perror(name);
-}
+ fprintf(stderr, "LHa: ");
-/* ------------------------------------------------------------------------ */
-void
-message(subject, name)
- char *subject, *name;
-{
- message_1("", subject, name);
+ va_start(v, fmt);
+ vfprintf(stderr, fmt, v);
+ va_end(v);
+
+ fputs("\n", stderr);
+
+ errno = errno_sv;
}
/* ------------------------------------------------------------------------ */
void
-warning(subject, name)
- char *subject, *name;
+warning(char *fmt, ...)
{
- message_1("Warning: ", subject, name);
+ int errno_sv = errno;
+ va_list v;
+
+ fprintf(stderr, "LHa: Warning: ");
+
+ va_start(v, fmt);
+ vfprintf(stderr, fmt, v);
+ va_end(v);
+
+ fputs("\n", stderr);
+
+ errno = errno_sv;
}
/* ------------------------------------------------------------------------ */
void
-error(subject, msg)
- char *subject, *msg;
+error(char *fmt, ...)
{
- message_1("Error: ", subject, msg);
+ int errno_sv = errno;
+ va_list v;
+
+ fprintf(stderr, "LHa: Error: ");
+
+ va_start(v, fmt);
+ vfprintf(stderr, fmt, v);
+ va_end(v);
+
+ fputs("\n", stderr);
+
+ errno = errno_sv;
}
-/* ------------------------------------------------------------------------ */
void
-fatal_error(msg)
- char *msg;
+fatal_error(char *fmt, ...)
{
- message_1("Fatal error:", "", msg);
+ int errno_sv = errno;
+ va_list v;
+
+ fprintf(stderr, "LHa: Fatal error: ");
+
+ va_start(v, fmt);
+ vfprintf(stderr, fmt, v);
+ va_end(v);
+
+ if (errno)
+ fprintf(stderr, ": %s\n", strerror(errno_sv));
+ else
+ fputs("\n", stderr);
if (remove_temporary_at_error) {
if (temporary_fd != -1)
/* ------------------------------------------------------------------------ */
void
-write_error()
-{
- fatal_error(writting_filename);
-}
-
-/* ------------------------------------------------------------------------ */
-void
-read_error()
-{
- fatal_error(reading_filename);
-}
-
-/* ------------------------------------------------------------------------ */
-void
interrupt(signo)
int signo;
{
- errno = 0;
- message("Interrupted\n", "");
+ message("Interrupted");
if (temporary_fd != -1)
close(temporary_fd);
if (recover_archive_when_interrupt)
rename(backup_archive_name, archive_name);
if (remove_extracting_file_when_interrupt) {
- errno = 0;
- message("Removing", writting_filename);
+ message("Removing: %s", writting_filename);
unlink(writting_filename);
}
signal(SIGINT, SIG_DFL);
for (i = 0; i < filec; i++)
if (GETSTAT(filev[i], &stbuf) < 0) {
flags[i] = 0x04;
- fprintf(stderr,
- "LHa: Cannot access \"%s\", ignored.\n", filev[i]);
+ warning("Cannot access \"%s\", ignored.", filev[i]);
}
else {
if (is_regularfile(&stbuf))
#endif
else {
flags[i] = 0x04;
- fprintf(stderr,
- "LHa: Cannot archive \"%s\", ignored.\n", filev[i]);
+ warning("Cannot archive \"%s\", ignored.", filev[i]);
}
}
- errno = 0;
for (i = 0; i < filec; i++) {
p = filev[i];
strcpy(temporary_name, TMP_FILENAME_TEMPLATE);
}
else {
- sprintf(temporary_name, "%s/lhXXXXXX", extract_directory);
+ xsnprintf(temporary_name, sizeof(temporary_name),
+ "%s/lhXXXXXX", extract_directory);
}
#else
char *p, *s;
FILE *fp;
if ((fp = fopen(name, mode)) == NULL)
- fatal_error(name);
+ fatal_error("Cannot open file \"%s\"", name);
return fp;
}
{
FILE *fp;
char *p;
+ static char expanded_archive_name[FILENAME_LENGTH];
if (!strcmp(archive_name, "-")) {
if (cmd == CMD_EXTRACT || cmd == CMD_LIST) {
if (open_old_archive_1(archive_name, &fp))
return fp;
- sprintf(expanded_archive_name, "%s.lzh", archive_name);
+ xsnprintf(expanded_archive_name, sizeof(expanded_archive_name),
+ "%s.lzh", archive_name);
if (open_old_archive_1(expanded_archive_name, &fp)) {
archive_name = expanded_archive_name;
return fp;
* if ( (errno&0xffff)!=E_PNNF ) { archive_name =
* expanded_archive_name; return NULL; }
*/
- sprintf(expanded_archive_name, "%s.lzs", archive_name);
+ xsnprintf(expanded_archive_name, sizeof(expanded_archive_name),
+ "%s.lzs", archive_name);
if (open_old_archive_1(expanded_archive_name, &fp)) {
archive_name = expanded_archive_name;
return fp;
skip_flg = FALSE;
if (stat(name, &stbuf) >= 0) {
if (!is_regularfile(&stbuf)) {
- error("Already exist (not a file)", name);
+ error("\"%s\" already exists (not a file)", name);
return FALSE;
}
}
if (p == path) {
- message("Why?", "ROOT");
+ message("invalid path name \"%s\"", name);
return FALSE; /* no more parent. */
}
if (GETSTAT(path, &stbuf) >= 0) {
if (is_directory(&stbuf))
return TRUE;
- error("Not a directory", path);
+ error("Not a directory \"%s\"", path);
return FALSE;
}
- errno = 0;
if (verbose)
- printf("Making directory \"%s\".\n", path);
+ message("Making directory \"%s\".", path);
#if defined __MINGW32__
if (mkdir(path) >= 0)
if (mkdir(path, 0777) >= 0) /* try */
return TRUE; /* successful done. */
#endif
- errno = 0;
if (!make_parent_path(path))
return FALSE;
#if defined __MINGW32__
if (mkdir(path) < 0)
- message("Cannot make directory", path);
+ error("Cannot make directory", path);
return FALSE;
#else
if (mkdir(path, 0777) < 0) { /* try again */
- message("Cannot make directory", path);
+ error("Cannot make directory", path);
return FALSE;
}
#endif
FILE *fp;
if ((fp = fopen(name, WRITE_BINARY)) == NULL) {
- errno = 0;
if (!make_parent_path(name) ||
(fp = fopen(name, WRITE_BINARY)) == NULL)
- error("Cannot extract", name);
- errno = 0;
+ error("Cannot extract a file \"%s\"", name);
}
return fp;
}
#endif /* HAVE_LCHWON */
chown(name, uid, gid);
}
- errno = 0;
}
}
}
if (extract_directory)
- sprintf(name, "%s/%s", extract_directory, q);
+ xsnprintf(name, sizeof(name), "%s/%s", extract_directory, q);
else
strcpy(name, q);
/* 1999.4.30 t.okamoto */
for (method = 0;; method++) {
if (methods[method] == NULL) {
- error("Unknown method skiped ...", name);
+ error("Unknown method \"%.*s\"; \"%s\" will be skiped ...",
+ 5, hdr->method, name);
return;
}
if (bcmp(hdr->method, methods[method], 5) == 0)
#if 0
for (method = 0;; method++) {
if (methods[method] == NULL) {
- error("Unknown method skiped ...", name);
- return;
+ error("Unknown method \"%.*s\"; \"%s\" will be skiped ...",
+ 5, hdr->method, name);
}
if (bcmp(hdr->method, methods[method], 5) == 0)
break;
#endif
unlink(name);
- errno = 0;
remove_extracting_file_when_interrupt = TRUE;
if ((fp = open_with_make_path(name)) != NULL) {
return;
}
- errno = 0;
if (hdr->has_crc && crc != hdr->crc)
- error("CRC error", name);
+ error("CRC error: \"%s\"", name);
}
else if ((hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_DIRECTORY
|| (hdr->unix_mode & UNIX_FILE_TYPEMASK) == UNIX_FILE_SYMLINK
l_code = symlink(bb2, bb1);
if (l_code < 0) {
if (quiet != TRUE)
- warning("Can't make Symbolic Link : ");
+ warning("Can't make Symbolic Link \"%s\" -> \"%s\"",
+ bb1, bb2);
}
if (quiet != TRUE) {
- printf("Symbolic Link %s -> %s\n", bb1, bb2);
+ message("Symbolic Link %s -> %s", bb1, bb2);
}
strcpy(name, bb1); /* Symbolic's name set */
#else
- sprintf(buf, "%s -> %s", bb1, bb2);
- warning("Can't make Symbolic Link", buf);
+ warning("Can't make Symbolic Link %s -> %s", bb1, bb2);
return;
#endif
} else { /* make directory */
}
}
else {
- error("Unknown information", name);
+ error("Unknown information: \"%s\"", name);
}
if (!output_to_stdout)
/* open archive file */
if ((afp = open_old_archive()) == NULL)
- fatal_error(archive_name);
+ fatal_error("Cannot open archive file \"%s\"", archive_name);
if (archive_is_msdos_sfx1(archive_name))
skip_msdos_sfx1_code(afp);
/* open archive file */
if ((afp = open_old_archive()) == NULL) {
- error(archive_name, "");
+ error("Cannot open archive \"%s\"", archive_name);
exit(1);
}
if (archive_is_msdos_sfx1(archive_name))
total += weight[i] * count[i];
}
if ((total & 0xffff) != 0)
- error("make_table()", "Bad table (5)\n");
+ error("make_table(): Bad table (5)");
/* shift data for make table. */
m = 16 - tablebits;
if (xsize == 0)
break;
if (ferror(f1)) {
- fatal_error("file read error\n");
+ fatal_error("file read error");
}
}
else {
xsize = (size > BUFFERSIZE) ? BUFFERSIZE : size;
if (fread(buf, 1, xsize, f1) != xsize) {
- fatal_error("file read error\n");
+ fatal_error("file read error");
}
}
/* write */
if (f2) {
if (crc_flg == 2 && text_mode) {
if (fwrite_txt(buf, xsize, f2)) {
- fatal_error("file write error\n");
+ fatal_error("file write error");
}
}
else {
if (fwrite(buf, 1, xsize, f2) != xsize) {
- fatal_error("file write error\n");
+ fatal_error("file write error");
}
}
}
}
#endif
+#include <stdarg.h>
+int
+xsnprintf(char *dest, size_t size, char *fmt, ...)
+{
+ int len;
+ va_list v;
+
+ va_start(v, fmt);
+ len = vsnprintf(dest, size, fmt, v);
+ va_end(v);
+
+ if (len == -1)
+ return -1;
+
+ if (len >= size) {
+ dest[size-1] = 0;
+ return -1;
+ }
+
+ return 0;
+}
+
/* Local Variables: */
/* mode:c */
/* tab-width:4 */