hush: stop doing manual acounting of open fd's, kernel can do it for us
authorDenis Vlasenko <vda.linux@googlemail.com>
Mon, 1 Oct 2007 09:59:01 +0000 (09:59 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Mon, 1 Oct 2007 09:59:01 +0000 (09:59 -0000)
shell/hush.c

index 9c705568ddb9f73a73359f6d18d3659d153abbf6..9181641b9fb351f4055fb1a366aee9e9f777d6ef 100644 (file)
@@ -277,11 +277,6 @@ struct pipe {
        smallint res_word;          /* needed for if, for, while, until... */
 };
 
-struct close_me {
-       struct close_me *next;
-       int fd;
-};
-
 /* On program start, environ points to initial environment.
  * putenv adds new pointers into it, unsetenv removes them.
  * Neither of these (de)allocates the strings.
@@ -362,7 +357,6 @@ struct globals {
        int global_argc;
        int last_return_code;
        const char *ifs;
-       struct close_me *close_me_head;
        const char *cwd;
        unsigned last_bg_pid;
        struct variable *top_var; /* = &shell_ver (set in main()) */
@@ -409,7 +403,6 @@ enum { run_list_level = 0 };
 #define last_return_code (G.last_return_code)
 #define ifs              (G.ifs             )
 #define fake_mode        (G.fake_mode       )
-#define close_me_head    (G.close_me_head   )
 #define cwd              (G.cwd             )
 #define last_bg_pid      (G.last_bg_pid     )
 #define top_var          (G.top_var         )
@@ -487,10 +480,6 @@ static int file_get(struct in_str *i);
 static int file_peek(struct in_str *i);
 static void setup_file_in_str(struct in_str *i, FILE *f);
 static void setup_string_in_str(struct in_str *i, const char *s);
-/*  close_me manipulations: */
-static void mark_open(int fd);
-static void mark_closed(int fd);
-static void close_all(void);
 /*  "run" the final data structures: */
 #if !defined(DEBUG_CLEAN)
 #define free_pipe_list(head, indent) free_pipe_list(head)
@@ -999,14 +988,13 @@ static int builtin_source(char **argv)
                bb_error_msg("cannot open '%s'", argv[1]);
                return EXIT_FAILURE;
        }
+       close_on_exec_on(fileno(input));
 
        /* Now run the file */
        /* XXX argv and argc are broken; need to save old global_argv
         * (pointer only is OK!) on this stack frame,
         * set global_argv=argv+1, recurse, and restore. */
-       mark_open(fileno(input));
        status = parse_and_run_file(input);
-       mark_closed(fileno(input));
        fclose(input);
        return status;
 }
@@ -1251,33 +1239,6 @@ static void setup_string_in_str(struct in_str *i, const char *s)
        i->eof_flag = 0;
 }
 
-static void mark_open(int fd)
-{
-       struct close_me *new = xmalloc(sizeof(struct close_me));
-       new->fd = fd;
-       new->next = close_me_head;
-       close_me_head = new;
-}
-
-static void mark_closed(int fd)
-{
-       struct close_me *tmp;
-       if (close_me_head == NULL || close_me_head->fd != fd)
-               bb_error_msg_and_die("corrupt close_me");
-       tmp = close_me_head;
-       close_me_head = close_me_head->next;
-       free(tmp);
-}
-
-static void close_all(void)
-{
-       struct close_me *c;
-       for (c = close_me_head; c; c = c->next) {
-               close(c->fd);
-       }
-       close_me_head = NULL;
-}
-
 /* squirrel != NULL means we squirrel away copies of stdin, stdout,
  * and stderr if they are redirected. */
 static int setup_redirects(struct child_prog *prog, int squirrel[])
@@ -1826,7 +1787,6 @@ static int run_pipe_real(struct pipe *pi)
                        }
 #endif
                        /* in non-interactive case fatal sigs are already SIG_DFL */
-                       close_all();
                        if (nextin != 0) {
                                dup2(nextin, 0);
                                close(nextin);
@@ -3183,7 +3143,7 @@ static int process_command_subs(o_string *dest, struct p_context *ctx,
 
        p = generate_stream_from_list(inner.list_head);
        if (p == NULL) return 1;
-       mark_open(fileno(p));
+       close_on_exec_on(fileno(p));
        setup_file_in_str(&pipe_str, p);
 
        /* now send results of command back into original context */
@@ -3206,7 +3166,6 @@ static int process_command_subs(o_string *dest, struct p_context *ctx,
         * to do better, by using wait(), and keeping track of background jobs
         * at the same time.  That would be a lot of work, and contrary
         * to the KISS philosophy of this program. */
-       mark_closed(fileno(p));
        retcode = fclose(p);
        free_pipe_list(inner.list_head, 0);
        debug_printf("closed FILE from child, retcode=%d\n", retcode);
@@ -3718,9 +3677,8 @@ int hush_main(int argc, char **argv)
                debug_printf("sourcing /etc/profile\n");
                input = fopen("/etc/profile", "r");
                if (input != NULL) {
-                       mark_open(fileno(input));
+                       close_on_exec_on(fileno(input));
                        parse_and_run_file(input);
-                       mark_closed(fileno(input));
                        fclose(input);
                }
        }