Use dup2 if available for -t. Also check for ttyname and isatty in configure.
authorNelson Ferreira <nelson.ferreira@ieee.org>
Mon, 5 Mar 2012 17:52:55 +0000 (12:52 -0500)
committerNelson Ferreira <nelson.ferreira@ieee.org>
Mon, 5 Mar 2012 17:52:55 +0000 (12:52 -0500)
* configure.ac: Add some additional functions to check and add the
HAVE_ISATTY and HAVE_TTYNAME

* src/emacs.c (main_1): Enhance the logging of -t with ttyname if
it is available.

* src/emacs.c (main_1): Use raw_open instead of open to avoid
using the format conversion of the filename, which at this early
stage is not setup yet.

* src/emacs.c (main_1): use dup2 if available to dup the opened
file (and then close the original descriptor). This is much more
reliable than close then open, since dup2 will make sure the
descriptor number will be the desired.

* src/eval.c (grow_specpdl): If grow_specpdl is called very early
on specpdl_size is 0 and will loop infinitely here because 2 * 0
== 0 ;)

* src/sysdep.c (raw_open): New function that just calls the system
open with no argument conversion at all

* src/sysfile.h: declare the new raw_open function.

Signed-off-by: Nelson Ferreira <nelson.ferreira@ieee.org>
configure.ac
src/buffer.c
src/emacs.c
src/eval.c
src/sysdep.c
src/sysfile.h

index 37279a5..2fefb30 100644 (file)
@@ -1696,7 +1696,12 @@ dnl Check for POSIX functions.
 dnl ----------------------------------------------------------------
 
 SXE_CHECK_BASIC_FUNS
-AC_CHECK_FUNCS([alarm cbrt closedir dup2 eaccess endpwent floor fmod fpathconf frexp fsync ftime ftruncate getaddrinfo getcwd gethostbyname gethostname getnameinfo getpagesize getrlimit gettimeofday getwd isascii link logb lrand48 matherr memchr memmove memset mkdir mktime munmap perror poll pow putenv random re_comp readlink regcomp rename res_init rint rmdir select setitimer setlocale setpgid setsid sigblock sighold sigprocmask snprintf socket sqrt stpcpy strcasecmp strchr strdup strerror strlwr strrchr strspn strtol strupr symlink tzset ulimit umask uname usleep utime vlimit vsnprintf waitpid wcscmp wcslen])
+AC_CHECK_FUNCS([alarm cbrt closedir dup2 eaccess endpwent floor fmod fpathconf frexp fsync ftime ftruncate getaddrinfo getcwd gethostbyname gethostname getnameinfo getpagesize getrlimit gettimeofday getwd isascii isatty link logb lrand48 matherr memchr memmove memset mkdir mktime munmap perror poll pow putenv random re_comp readlink regcomp rename res_init rint rmdir select setitimer setlocale setpgid setsid sigblock sighold sigprocmask snprintf socket sqrt stpcpy strncpy strncat strcasecmp strchr strdup strerror strlwr strrchr strspn strtol strupr symlink ttyname tzset ulimit umask uname usleep utime vlimit vsnprintf waitpid wcscmp wcslen])
+
+AS_IF([test "$have_isatty" = "yes"],
+       AC_DEFINE([HAVE_ISATTY], [1], [isatty is available]))
+AS_IF([test "$have_ttyname" = "yes"],
+       AC_DEFINE([HAVE_TTYNAME], [1], [ttyname is available]))
 
 
 ## combines all these time structures and funs
index a6ad0e8..922fa9c 100644 (file)
@@ -1734,8 +1734,8 @@ typedef struct {
        Dynarr_declare(Extbyte_dynarr *);
 } Extbyte_dynarr_dynarr;
 
-static Extbyte_dynarr_dynarr *conversion_out_dynarr_list;
-static Bufbyte_dynarr_dynarr *conversion_in_dynarr_list;
+static Extbyte_dynarr_dynarr *conversion_out_dynarr_list = NULL;
+static Bufbyte_dynarr_dynarr *conversion_in_dynarr_list = NULL;
 
 static int dfc_convert_to_external_format_in_use;
 static int dfc_convert_to_internal_format_in_use;
@@ -1764,7 +1764,7 @@ dfc_convert_to_external_format(dfc_conversion_type source_type,
                               dfc_conversion_data * sink)
 {
        int count = specpdl_depth();
-       Extbyte_dynarr *conversion_out_dynarr;
+       Extbyte_dynarr *conversion_out_dynarr = NULL;
 
        type_checking_assert
            (((source_type == DFC_TYPE_DATA) ||
@@ -1778,6 +1778,7 @@ dfc_convert_to_external_format(dfc_conversion_type source_type,
 
        record_unwind_protect(dfc_convert_to_external_format_reset_in_use,
                              make_int(dfc_convert_to_external_format_in_use));
+       assert(conversion_out_dynarr_list != NULL);
        if (Dynarr_length(conversion_out_dynarr_list) <=
            dfc_convert_to_external_format_in_use)
                Dynarr_add(conversion_out_dynarr_list, Dynarr_new(Extbyte));
@@ -1920,7 +1921,7 @@ dfc_convert_to_internal_format(dfc_conversion_type source_type,
                               dfc_conversion_data * sink)
 {
        int count = specpdl_depth();
-       Bufbyte_dynarr *conversion_in_dynarr;
+       Bufbyte_dynarr *conversion_in_dynarr = NULL;
 
        type_checking_assert
            ((source_type == DFC_TYPE_DATA ||
@@ -1931,6 +1932,7 @@ dfc_convert_to_internal_format(dfc_conversion_type source_type,
 
        record_unwind_protect(dfc_convert_to_internal_format_reset_in_use,
                              make_int(dfc_convert_to_internal_format_in_use));
+       assert(conversion_in_dynarr_list != NULL);
        if (Dynarr_length(conversion_in_dynarr_list) <=
            dfc_convert_to_internal_format_in_use)
                Dynarr_add(conversion_in_dynarr_list, Dynarr_new(Bufbyte));
index 7ecacdb..c47e6a7 100644 (file)
@@ -1040,9 +1040,27 @@ DOESNT_RETURN main_1(int argc, char **argv, char **envp, int restart)
                if (argmatch
                    (argv, argc, "-t", "--terminal", 4, &term, &skip_args)) {
                        int tdesc = -1;
+#ifdef HAVE_TTYNAME
+                       stderr_out("Opening for terminal usage %s (current: %s)\n", term, ttyname(0));
+#else
+                       stderr_out("Opening for terminal usage %s\n", term, ttyname(0));
+#endif
+#ifdef HAVE_DUP2
+                       tdesc = raw_open(term, O_RDWR | OPEN_BINARY, 2);
+                       if (tdesc < 0)
+                               fatal("%s: %s", term, strerror(errno));
+                       /* Request dup into fd 0 */
+                       if ( dup2(tdesc,0) < 0 )
+                               fatal("%s: %s", term, strerror(errno));
+                       stderr_out("Dup(0) ok\n");
+                       /* Requesr dup into fd 1 */
+                       if ( dup2(tdesc,1) < 0 )
+                               fatal("%s: %s", term, strerror(errno));
+                       close(tdesc);
+#else
                        close(0);
                        close(1);
-                       tdesc = open(term, O_RDWR | OPEN_BINARY, 2);
+                       tdesc = raw_open(term, O_RDWR | OPEN_BINARY, 2);
                        if (tdesc < 0)
                                fatal("%s: %s", term, strerror(errno));
                        assert(tdesc==0);
@@ -1051,14 +1069,19 @@ DOESNT_RETURN main_1(int argc, char **argv, char **envp, int restart)
                                fatal("dup failed %s: %s", term, strerror(errno));
                        }
                        assert(tdesc==1);
+#endif
+#ifdef HAVE_ISATTY
                        if (!isatty(0)) {
                                fatal("%s: not a tty", term);
                        }
-#if 0
-                       stderr_out("Using %s", ttyname(0));
 #endif
-                       stderr_out("Using %s", term);
-                       inhibit_window_system = 1;      /* -t => -nw */
+#ifdef HAVE_TTYNAME
+                       stderr_out("Using tty %s\n", ttyname(0));
+#else
+                       stderr_out("Using %tty s\n", term);
+#endif
+                       inhibit_window_system = 1;      /* -t => -nw
+                                                        * */
                }
        }
 
index e92bf4c..292b056 100644 (file)
@@ -4531,6 +4531,8 @@ call3_trapping_errors(char *warning_string, Lisp_Object function,
 void grow_specpdl(EMACS_INT reserved)
 {
        EMACS_INT size_needed = specpdl_depth() + reserved;
+       if (specpdl_size == 0)
+               specpdl_size = 1;
        if (size_needed >= max_specpdl_size) {
                if (max_specpdl_size < min_max_specpdl_size)
                        max_specpdl_size = min_max_specpdl_size;
index f4a9404..292ae01 100644 (file)
@@ -2300,6 +2300,19 @@ const char *strerror(int errnum)
    Jamie's home page (http://www.jwz.org/worse-is-better.html). */
 
 #ifdef ENCAPSULATE_OPEN
+
+int raw_open(const char *path, int oflag, ...)
+{
+       int mode;
+       va_list ap;
+       char *pout;
+
+       va_start(ap, oflag);
+       mode = va_arg(ap, int);
+       va_end(ap);
+       return open(pout, oflag, mode);
+}
+
 int sys_open(const char *path, int oflag, ...)
 {
        int mode;
index 254252f..df59f91 100644 (file)
@@ -304,6 +304,7 @@ ssize_t sys_write(int, const void *, size_t);
 
 #ifdef ENCAPSULATE_OPEN
 int sys_open(const char *, int, ...);
+int raw_open(const char *, int, ...);
 #endif
 #if defined (ENCAPSULATE_OPEN) && !defined (DONT_ENCAPSULATE)
 # undef open
@@ -311,6 +312,7 @@ int sys_open(const char *, int, ...);
 #endif
 #if !defined (ENCAPSULATE_OPEN) && defined (DONT_ENCAPSULATE)
 # define sys_open open
+# define raw_open open
 #endif
 
 #ifdef ENCAPSULATE_CLOSE