OSDN Git Service

* src/prototypes.h: updated.
authorarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 20 Jul 2003 20:48:31 +0000 (20:48 +0000)
committerarai <arai@6a8cc165-1e22-0410-a132-eb4e3f353aba>
Sun, 20 Jul 2003 20:48:31 +0000 (20:48 +0000)
* src/append.c (encode_lzhuf): set actual copied size.

* src/util.c (encode_stored_crc): use size_t instead of long.

* src/lhadd.c (temporary_to_new_archive_file): ditto.
(cmd_add): ditto.
(cmd_delete): ditto.

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/lha/lha/trunk@725 6a8cc165-1e22-0410-a132-eb4e3f353aba

src/append.c
src/lhadd.c
src/prototypes.h
src/util.c

index 26ec62e..6766c31 100644 (file)
@@ -39,8 +39,8 @@ encode_lzhuf(infp, outfp, size, original_size_var, packed_size_var,
         *packed_size_var = interface.packed;
         *original_size_var = interface.original;
     } else {
-        copyfile(infp, outfp, size, 0, &crc);
-        *packed_size_var = *original_size_var = size;
+        *packed_size_var = *original_size_var =
+            copyfile(infp, outfp, size, 0, &crc);
     }
     memcpy(hdr_method, "-lh -", 5);
     hdr_method[3] = interface.method + '0';
index 4654a4a..50b1fb8 100644 (file)
@@ -95,7 +95,7 @@ append_it(name, oafp, nafp)
         error("Cannot access file \"%s\"", name);   /* See cleaning_files, Why? */
         return oafp;
     }
-    
+
     directory = is_directory(&stbuf);
 #ifdef S_IFLNK
     symlink = is_symlink(&stbuf);
@@ -312,9 +312,9 @@ report_archive_name_if_different()
 /* ------------------------------------------------------------------------ */
 void
 temporary_to_new_archive_file(new_archive_size)
-    long            new_archive_size;
+    size_t new_archive_size;
 {
-    FILE           *oafp, *nafp;
+    FILE *oafp, *nafp;
 
     if (!strcmp(new_archive_name, "-")) {
         nafp = stdout;
@@ -437,7 +437,7 @@ cmd_add()
     int             i;
     long            old_header;
     boolean         old_archive_exist;
-    long            new_archive_size;
+    size_t          new_archive_size;
 
     /* exit if no operation */
     if (!update_if_newer && cmd_filec == 0) {
@@ -536,8 +536,17 @@ cmd_add()
 
     new_archive_size = 0;       /* avoid compiler warnings `uninitialized' */
     if (!noexec) {
+        off_t tmp;
+
         write_archive_tail(nafp);
-        new_archive_size = ftello(nafp);
+        tmp = ftello(nafp);
+        if (tmp == -1) {
+            warning("ftello(): %s", strerror(errno));
+            new_archive_size = 0;
+        }
+        else
+            new_archive_size = tmp;
+
         fclose(nafp);
     }
 
@@ -548,9 +557,13 @@ cmd_add()
     report_archive_name_if_different();
 
     /* copy temporary file to new archive file */
-    if (!noexec && (!strcmp(new_archive_name, "-") ||
-            rename(temporary_name, new_archive_name) < 0))
-        temporary_to_new_archive_file(new_archive_size);
+    if (!noexec) {
+        if (strcmp(new_archive_name, "-") == 0 ||
+            rename(temporary_name, new_archive_name) < 0) {
+
+            temporary_to_new_archive_file(new_archive_size);
+        }
+    }
 
     /* set new archive file mode/group */
     set_archive_file_mode();
@@ -566,8 +579,8 @@ cmd_add()
 void
 cmd_delete()
 {
-    FILE           *oafp, *nafp;
-    long            new_archive_size;
+    FILE *oafp, *nafp;
+    size_t new_archive_size;
 
     /* open old archive if exist */
     if ((oafp = open_old_archive()) == NULL)
@@ -600,8 +613,17 @@ cmd_delete()
 
     new_archive_size = 0;       /* avoid compiler warnings `uninitialized' */
     if (!noexec) {
+        off_t tmp;
+
         write_archive_tail(nafp);
-        new_archive_size = ftello(nafp);
+        tmp = ftello(nafp);
+        if (tmp == -1) {
+            warning("ftello(): %s", strerror(errno));
+            new_archive_size = 0;
+        }
+        else
+            new_archive_size = tmp;
+
         fclose(nafp);
     }
 
@@ -621,8 +643,10 @@ cmd_delete()
     report_archive_name_if_different();
 
     /* copy temporary file to new archive file */
-    if (!noexec && rename(temporary_name, new_archive_name) < 0)
-        temporary_to_new_archive_file(new_archive_size);
+    if (!noexec) {
+        if (rename(temporary_name, new_archive_name) < 0)
+            temporary_to_new_archive_file(new_archive_size);
+    }
 
     /* set new archive file mode/group */
     set_archive_file_mode();
index 7dc32ad..0ef1bc2 100644 (file)
@@ -66,7 +66,7 @@ unsigned short decode_p_lz5 P_((void));
 void decode_start_lz5 P_((void));
 /* lhadd.c */
 FILE *append_it P_((char *name, FILE *oafp, FILE *nafp));
-void temporary_to_new_archive_file P_((long new_archive_size));
+void temporary_to_new_archive_file P_((size_t new_archive_size));
 void cmd_add P_((void));
 void cmd_delete P_((void));
 /* lharc.c */
@@ -116,7 +116,7 @@ int encode_alloc P_((int method));
 unsigned int encode P_((struct interfacing *interface));
 unsigned int decode P_((struct interfacing *interface));
 /* util.c */
-size_t copyfile P_((FILE *f1, FILE *f2, long size, int text_flg, unsigned int *crcp));
+size_t copyfile P_((FILE *f1, FILE *f2, size_t size, int text_flg, unsigned int *crcp));
 int encode_stored_crc P_((FILE *ifp, FILE *ofp, size_t size, size_t *original_size_var, size_t *write_size_var));
 boolean archive_is_msdos_sfx1 P_((char *name));
 int xsnprintf P_((char *dest, size_t size, char *fmt, ...));
index b69d3d6..5956570 100644 (file)
@@ -19,7 +19,7 @@ size_t
 copyfile(f1, f2, size, text_flg, crcp)  /* return: size of source file */
     FILE *f1;
     FILE *f2;
-    long size;
+    size_t size;
     int text_flg;               /* 0: binary, 1: read text, 2: write text */
     unsigned int *crcp;
 {
@@ -50,8 +50,12 @@ copyfile(f1, f2, size, text_flg, crcp)  /* return: size of source file */
             if (fread(buf, 1, xsize, f1) != xsize) {
                 fatal_error("file read error");
             }
-            size -= xsize;
+            if (size < xsize)
+                size = 0;
+            else
+                size -= xsize;
         }
+
         /* write */
         if (f2) {
             if (text_flg & 2) {
@@ -65,6 +69,7 @@ copyfile(f1, f2, size, text_flg, crcp)  /* return: size of source file */
                 }
             }
         }
+
         /* calculate crc */
         if (crcp) {
             *crcp = calccrc(*crcp, buf, xsize);