This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[fastjar patch] Separate -C case out of add_to_jar
- From: Nathanael Nerode <neroden at twcny dot rr dot com>
- To: gcc-patches at gcc dot gnu dot org, java-patches at gcc dot gnu dot org
- Date: Sun, 15 Jun 2003 17:01:00 -0400
- Subject: [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>