diff options
author | Roland McGrath <roland@gnu.org> | 2000-03-13 05:57:50 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2000-03-13 05:57:50 +0000 |
commit | d6033be5917f89e4afd0a1c3589f3093ffee0b88 (patch) | |
tree | 49f1219195f837f045db1ada48696cde111aef63 | |
parent | ae2fb514fd4a7bccd202585ce3c82dc699fd7ba3 (diff) |
2000-03-13 Roland McGrath <roland@baalperazim.frob.com>
* exec.c (prepare_stream): New function, broken out of prepare.
(prepare): Call it.
[_STDIO_USES_IOSTREAM]: Do #error if this is defined.
(map, input_room, close_exec_stream, fake_seek, prepare_stream):
Conditionalize all these definitions on [! _STDIO_USES_IOSTREAM].
Only map and prepare_stream are called from elsewhere in the code.
(check_gzip): Don't reinitialize E->stream, since it will in fact not
be used again.
(check_bzip2): Likewise.
-rw-r--r-- | exec/exec.c | 71 |
1 files changed, 39 insertions, 32 deletions
diff --git a/exec/exec.c b/exec/exec.c index 02ca43f8..4543776b 100644 --- a/exec/exec.c +++ b/exec/exec.c @@ -1,5 +1,5 @@ /* GNU Hurd standard exec server. - Copyright (C) 1992,93,94,95,96,98,99 Free Software Foundation, Inc. + Copyright (C) 1992,93,94,95,96,98,99,2000 Free Software Foundation, Inc. Written by Roland McGrath. Can exec ELF format directly. @@ -435,6 +435,16 @@ load_section (void *section, struct execdata *u) /* Make sure our mapping window (or read buffer) covers LEN bytes of the file starting at POSN. */ +static void *map (struct execdata *e, off_t posn, size_t len); + +/* Initialize E's stdio stream. */ +static void prepare_stream (struct execdata *e); + +#ifdef _STDIO_USES_IOSTREAM + +# error implement me for libio! + +#else /* old GNU stdio */ static void * map (struct execdata *e, off_t posn, size_t len) @@ -561,6 +571,22 @@ fake_seek (void *cookie, fpos_t *pos, int whence) return 0; } +/* Initialize E's stdio stream. */ +static void +prepare_stream (struct execdata *e) +{ + memset (&e->stream, 0, sizeof (e->stream)); + e->stream.__magic = _IOMAGIC; + e->stream.__mode.__read = 1; + e->stream.__userbuf = 1; + e->stream.__room_funcs.__input = input_room; + e->stream.__io_funcs.seek = fake_seek; + e->stream.__io_funcs.close = close_exec_stream; + e->stream.__cookie = e; + e->stream.__seen = 1; +} +#endif + /* Prepare to check and load FILE. */ static void @@ -580,17 +606,6 @@ prepare (file_t file, struct execdata *e) e->interp.section = NULL; - /* Initialize E's stdio stream. */ - memset (&e->stream, 0, sizeof (e->stream)); - e->stream.__magic = _IOMAGIC; - e->stream.__mode.__read = 1; - e->stream.__userbuf = 1; - e->stream.__room_funcs.__input = input_room; - e->stream.__io_funcs.seek = fake_seek; - e->stream.__io_funcs.close = close_exec_stream; - e->stream.__cookie = e; - e->stream.__seen = 1; - /* Try to mmap FILE. */ e->error = io_map (file, &rd, &wr); if (! e->error) @@ -657,6 +672,9 @@ prepare (file_t file, struct execdata *e) else if (e->error == EOPNOTSUPP) /* We can't mmap FILE, but perhaps we can do normal I/O to it. */ e->error = 0; + + /* Initialize E's stdio stream. */ + prepare_stream (e); } /* Check the magic number, etc. of the file. @@ -1031,18 +1049,12 @@ check_gzip (struct execdata *earg) e->file_data = zipdata; e->file_size = zipdatasz; - /* Clean up the old exec file stream's state. */ + /* Clean up the old exec file stream's state. + Now that we have the contents all in memory (in E->file_data), + nothing will in fact ever try to use E->stream again. */ finish (e, 0); - /* Point the stream at the buffer of file data. */ - memset (&e->stream, 0, sizeof (e->stream)); - e->stream.__magic = _IOMAGIC; - e->stream.__mode.__read = 1; - e->stream.__buffer = e->file_data; - e->stream.__bufsize = e->file_size; - e->stream.__get_limit = e->stream.__buffer + e->stream.__bufsize; - e->stream.__bufp = e->stream.__buffer; - e->stream.__seen = 1; + *(int *)&e->stream = 0; /* clobber magic number field just in case */ } #endif @@ -1123,18 +1135,13 @@ check_bzip2 (struct execdata *earg) e->file_data = zipdata; e->file_size = zipdatasz; - /* Clean up the old exec file stream's state. */ + + /* Clean up the old exec file stream's state. + Now that we have the contents all in memory (in E->file_data), + nothing will in fact ever try to use E->stream again. */ finish (e, 0); - /* Point the stream at the buffer of file data. */ - memset (&e->stream, 0, sizeof (e->stream)); - e->stream.__magic = _IOMAGIC; - e->stream.__mode.__read = 1; - e->stream.__buffer = e->file_data; - e->stream.__bufsize = e->file_size; - e->stream.__get_limit = e->stream.__buffer + e->stream.__bufsize; - e->stream.__bufp = e->stream.__buffer; - e->stream.__seen = 1; + *(int *)&e->stream = 0; /* clobber magic number field just in case */ } #endif |