This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[fastjar patch] Separate -C case out of add_to_jar


I split out the -C case into its own function, separate from the regular case.
This eliminates the recursive allocation of a const char[1024] on the stack,
cleans up the arguments for the regular add_to_jar, and makes error recovery
somewhat better in the -C case (fixing a bug where self-inclusion 
avoidance skipped the directory reset code).

I also fixed a place where '0' was returned instead of '1' on an error.

Tested on i686-pc-linux-gnu.  All OK.

	PR java/9532
	* jartool.c (add_to_jar): Return 1 on failure to open file.
	Split out -C case to:
	* jartool.c (add_to_jar_with_dir): New function.

Index: jartool.c
===================================================================
RCS file: /cvs/gcc/gcc/fastjar/jartool.c,v
retrieving revision 1.23
diff -u -r1.23 jartool.c
--- jartool.c	15 Jun 2003 20:25:44 -0000	1.23
+++ jartool.c	15 Jun 2003 20:55:46 -0000
@@ -274,7 +274,8 @@
 int list_jar(int, char**, int);
 int extract_jar(int, char**, int);
 int add_file_to_jar(int, int, const char*, struct stat*);
-int add_to_jar(int, const char*, const char*);
+int add_to_jar(int, const char*);
+int add_to_jar_with_dir(int, const char*, const char*);
 int create_central_header(int);
 int make_manifest(int, const char*);
 static void init_args(char **, int);
@@ -511,14 +512,14 @@
           fprintf(stderr, "Error: missing argument for -C.\n");
           exit(1);
         }
-	if (add_to_jar(jarfd, dir_to_change, file_to_add)) {
+	if (add_to_jar_with_dir(jarfd, dir_to_change, file_to_add)) {
           fprintf(stderr,
                  "Error adding %s (in directory %s) to jar archive!\n",
                  file_to_add, dir_to_change);
           exit(1);
         }
       } else {
-        if(add_to_jar(jarfd, NULL, arg)){
+        if(add_to_jar(jarfd, arg)){
           fprintf(stderr, "Error adding %s to jar archive!\n", arg);
           exit(1);
         }
@@ -815,13 +816,36 @@
   return 0;
 }
 
-int add_to_jar(int fd, const char *new_dir, const char *file){
+/* Implements -C by wrapping add_to_jar.  new_dir is the directory 
+   to switch to. */
+int 
+add_to_jar_with_dir (int fd, const char* new_dir, const char* file)
+{
+  int retval;
+  char old_dir[MAXPATHLEN]; 
+  if (getcwd(old_dir, MAXPATHLEN) == NULL) {
+    perror("getcwd");
+    return 1;
+  }
+  if (chdir(new_dir) == -1) {
+    perror(new_dir);
+    return 1;
+  }
+  retval=add_to_jar(fd, file);
+  if (chdir(old_dir) == -1) {
+    perror(old_dir);
+    return 1;
+  }
+  return retval;
+}
+
+int 
+add_to_jar (int fd, const char *file) {
   struct stat statbuf;
   DIR *dir;
   struct dirent *de;
   zipentry *ze;
   int stat_return;
-  char old_dir[MAXPATHLEN];
 
   /* This is a quick compatibility fix -- Simon Weijgers <simon@weijgers.com> 
    * It fixes this:
@@ -833,19 +857,6 @@
   while (*file=='.' && *(file+1)=='/')
     file+=2;
   
-  /* If new_dir isn't null, we need to change to that directory.  However,
-     we also need to return to the old directory when we're done.  See below.*/
-  if(new_dir != NULL){
-    if (getcwd(old_dir, MAXPATHLEN) == NULL) {
-      perror("getcwd");
-      return 1;
-    }
-    if(chdir(new_dir) == -1){
-      perror(new_dir);
-      return 1;
-    }
-  }
-
   if(jarfile && !strcmp(file, jarfile)){
     if(verbose)
       printf("skipping: %s\n", file);
@@ -936,7 +947,7 @@
 
       strcpy(t_ptr, de->d_name);
 
-      if(add_to_jar(fd, NULL, fullname)){
+      if (add_to_jar(fd, fullname)) {
         fprintf(stderr, "Error adding file to jar!\n");
         return 1;
       }
@@ -951,7 +962,7 @@
     add_fd = open(file, O_RDONLY | O_BINARY);
     if(add_fd < 0){
       fprintf(stderr, "Error opening %s.\n", file);
-      return 0;
+      return 1;
     }
     
     if(add_file_to_jar(fd, add_fd, file, &statbuf)){
@@ -962,16 +973,6 @@
   } else {
     fprintf(stderr, "Illegal file specified: %s\n", file);
   }
-  
-  /* If (and only if!) new_dir != NULL, we switched directories, so
-     we have to switch back to the old directory. */
-  if (new_dir != NULL) {
-    if (chdir(old_dir) == -1) {
-      perror(old_dir);
-      return 1;
-    }
-  }
-
   return 0;
 }
 

-- 
Nathanael Nerode  <neroden at gcc.gnu.org>
Don't use the GNU FDL for free documentation.  See
<http://home.twcny.rr.com/nerode/neroden/fdl.html>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]