Mercurial > emacs
changeset 8285:6609af160f16
(init_system_name): Retry gethostbyname after TRY_AGAIN failure.
(sys_subshell): Expand ~ in dir.
Do the processing of dir before calling fork.
Use vfork.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Tue, 19 Jul 1994 19:34:17 +0000 |
parents | f21e11ac80bb |
children | 60e866c3e99c |
files | src/sysdep.c |
diffstat | 1 files changed, 38 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/src/sysdep.c Tue Jul 19 16:43:47 1994 +0000 +++ b/src/sysdep.c Tue Jul 19 19:34:17 1994 +0000 @@ -643,8 +643,11 @@ int st; char oldwd[MAXPATHLEN+1]; /* Fixed length is safe on MSDOS. */ #endif - int pid = fork (); + int pid; struct save_signal saved_handlers[5]; + Lisp_Object dir; + unsigned char *str = 0; + int len; saved_handlers[0].code = SIGINT; saved_handlers[1].code = SIGQUIT; @@ -656,6 +659,27 @@ saved_handlers[3].code = 0; #endif + /* Mentioning current_buffer->buffer would mean including buffer.h, + which somehow wedges the hp compiler. So instead... */ + + dir = intern ("default-directory"); + /* Can't use NILP */ + if (XFASTINT (Fboundp (dir)) == XFASTINT (Qnil)) + goto xyzzy; + dir = Fsymbol_value (dir); + if (XTYPE (dir) != Lisp_String) + goto xyzzy; + + dir = expand_and_dir_to_file (Funhandled_file_name_directory (dir), Qnil); + str = (unsigned char *) alloca (XSTRING (dir)->size + 2); + len = XSTRING (dir)->size; + bcopy (XSTRING (dir)->data, str, len); + if (str[len - 1] != '/') str[len++] = '/'; + str[len] = 0; + xyzzy: + + pid = vfork (); + if (pid == -1) error ("Can't spawn subshell"); if (pid == 0) @@ -670,30 +694,9 @@ sh = "sh"; /* Use our buffer's default directory for the subshell. */ - { - Lisp_Object dir; - unsigned char *str; - int len; - - /* mentioning current_buffer->buffer would mean including buffer.h, - which somehow wedges the hp compiler. So instead... */ - - dir = intern ("default-directory"); - /* Can't use NILP */ - if (XFASTINT (Fboundp (dir)) == XFASTINT (Qnil)) - goto xyzzy; - dir = Fsymbol_value (dir); - if (XTYPE (dir) != Lisp_String) - goto xyzzy; - - str = (unsigned char *) alloca (XSTRING (dir)->size + 2); - len = XSTRING (dir)->size; - bcopy (XSTRING (dir)->data, str, len); - if (str[len - 1] != '/') str[len++] = '/'; - str[len] = 0; + if (str) chdir (str); - } - xyzzy: + #ifdef subprocesses close_process_descs (); /* Close Emacs's pipes/ptys */ #endif @@ -2033,7 +2036,17 @@ if (initialized) #endif /* not CANNOT_DUMP */ { - struct hostent *hp = gethostbyname (hostname); + struct hostent *hp; + int count; + for (count = 0; count < 10; count++) + { + hp = gethostbyname (hostname); +#ifdef TRY_AGAIN + if (! (hp == 0 && h_errno == TRY_AGAIN)) +#endif + break; + Fsleep_for (make_number (1), Qnil); + } if (hp) { char *fqdn = hp->h_name;