diff src/callproc.c @ 26088:b7aa6ac26872

Add support for large files, 64-bit Solaris, system locale codings. * Makefile.in (emacs): Set the LC_ALL environment variable to "C" when dumping, so that the dumped Emacs doesn't have stray locale info. (dired.o): Depend on systime.h. (editfns.o): Depend on coding.h. * alloc.c, buffer.c, callproc.c, ccl.c, charset.c, coding.c, data.c, dispnew.c, editfns.c, emacs.c, filelock.c, floatfns.c, hftctl.c, keyboard.c, process.c, sysdep.c, unexelf.c, unexhp9k800.c, unexsunos4.c, vmsfns.c, vmsgmalloc.c, w32faces.c, w32menu.c, w32term.c, w32xfns.c, xfaces.c, xfns.c, xmenu.c, xterm.c: Include <config.h> before any system include files. * alloc.c, buffer.c, ccl.c, data.c, editfns.c, emacs.c, eval.c, fileio.c, filelock.c, frame.c, insdel.c, keymap.c, lread.c, m/alpha.h, print.c, search.c, sysdep.c, xdisp.c, xfaces.c, xfns.c, xmenu.c, xterm.c: Do not include <stdlib.h>, as <config.h> does this now. * callproc.c (Fcall_process): Synchronize messages locale before invoking strerror. Decode resulting string with locale-coding-system. * coding.c (Vlocale_coding_system): New var. (syms_of_coding): Adjust to above change. (emacs_strerror): New function. * coding.h (emacs_strerror, Vlocale_coding_system): New decls. * config.in (HAVE_STDIO_EXT_H, HAVE_TM_GMTOFF, HAVE___FPENDING, HAVE_FTELLO, HAVE_GETLOADAVG, HAVE_MBLEN, HAVE_MBRLEN, HAVE_STRSIGNAL): New macros. (BITS_PER_LONG): Default to 64 if _LP64 is defined. <stdlib.h>: Include if HAVE_STDLIB_H is defined and NOT_C_CODE isn't. * dired.c: Include "systime.h". (Ffile_attributes): Do not cast s.st_size to int; this loses information if int is 32 bits but st_size and EMACS_INT are larger. Treat large device numbers like large inode numbers. * dispnew.c (PENDING_OUTPUT_COUNT): Use __fpending if available. * editfns.c: Include coding.h. (emacs_strftime): Remove decl. (emacs_strftimeu): New decl. (emacs_memftimeu): Renamed from emacs_memftime; new arg UT. Use emacs_strftimeu instead of emacs_strftime. (Fformat_time_string): Convert format string using Vlocale_coding_system, and convert result back. Synchronize time locale before invoking lower level function. Invoke emacs_memftimeu, passing ut, instead of emacs_memftime. * emacs.c: Include <locale.h> if HAVE_SETLOCALE is defined. (Vmessages_locale, Vprevious_messages_locale, Vtime_locale, Vprevious_time_locale): New variables. (main): Invoke setlocale early, so that initial error messages are localized properly. But skip locale-setting if LC_ALL is "C". Fix up locale when it's safe to do so. (fixup_locale): Moved here from xterm.c. (synchronize_locale, synchronize_time_locale, synchronize_messages_locale): New functions. (syms_of_emacs): Accommodate above changes. * fileio.c (report_file_error): Convert strerror output according to Vlocale_coding_system. (Finsert_file_contents): Check for arithmetic overflow in computations that depend on file size. Report IO errors with emacs_strerror, not strerror. * fns.c (Fgethash): Declare dflt parameter. * gmalloc.c: Do not define const to nothing if HAVE_CONFIG_H is defined; that's config.h's job. * lisp.h (EMACS_INT, BITS_PER_EMACS_INT, EMACS_UINT): If _LP64, default these values to long, BITS_PER_LONG, and unsigned long. (VALBITS, MARKBIT, XINT): Do not assume 32-bit EMACS_INT. (PNTR_COMPARISON_TYPE): Default to EMACS_UINT, not to unsigned int. (code_convert_string_norecord, fixup_locale, synchronize_messages_locale, synchronize_time_locale, emacs_open, emacs_close, emacs_read, emacs_write): New decls. All Emacs callers of open, close, read, write changed to use emacs_open, emacs_close, emacs_read, emacs_write. * lread.c (file_offset, file_tell): New macros. All uses of ftell changed to file_tell. (saved_doc_string_position, prev_saved_doc_string_position): Now of type file_offset. (init_lread): Do not fix locale here; fixup_locale now does this. * m/amdahl.h, s/usg5-4.h: (NSIG): Remove. (NSIG_MINIMUM): New macro. * m/cydra5.h, m/dpx2.h, m/mips.h, m/pfa50.h, m/sps7.h, m/stride.h, m/ustation.h, s/gnu-linux.h, s/hpux.h, s/iris3-5.h, s/iris3-6.h, s/umips.h, s/usg5-4.h: (SIGIO): Do not undef. (BROKEN_SIGIO): New macro. * m/ustation.h: (SIGTSTP): Do not undef. (BROKEN_SIGTSTP): New macro. * s/gnu-linux.h: (SIGPOLL, SIGURG): Do not undef. (BROKEN_SIGPOLL, BROKEN_SIGURG): New macros. * s/ptx4.h: (SIGINFO): Do not undef. (BROKEN_SIGINFO): New macros. * m/delta.h, s/ptx.h, s/template.h: Doc fix. * mktime.c, strftime.c: Update to glibc 2.1.2 version, with some Emacs-related changes merged. * print.c (float_to_string): Prepend "-" to representation of a NaN if the NaN is negative. * process.c (sys_siglist): Omit if HAVE_STRSIGNAL. (wait_reading_process_input): Use emacs_strerror, not strerror. * process.c (status_message, sigchld_handler): Synchronize locale, then use strsignal istead of sys_siglist. * w32proc.c (sys_wait): Likewise. * s/aix3-1.h, s/bsd4-1.h, s/dgux.h, s/gnu-linux.h, s/hiuxmpp.h, s/hpux.h, s/iris3-5.h, s/iris3-6.h, s/irix3-3.h, s/osf1.h, s/rtu.h, s/sunos4-1.h, s/unipl5-0.h, s/unipl5-2.h, s/usg5-0.h, s/usg5-2-2.h, s/usg5-2.h, s/usg5-3.h, s/xenix.h: (open, close, read, write, INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE, INTERRUPTIBLE_IO): Remove. * s/sol2-5.h (_LARGEFILE_SOURCE, _FILE_OFFSET_BITS): New macros. * sysdep.c (sys_read, sys_write, read, write, sys_close, close, sys_open, open): Remove. (emacs_open, emacs_close, emacs_read, emacs_write): Always define; the old INTERRUPTIBLE_OPEN, INTERRUPTIBLE_CLOSE, and INTERRUPTIBLE_IO macros are no longer used. (emacs_open): Renamed from sys_open. Merge BSD4_1 version. (emacs_close): Renamed from sys_close. (emacs_read): Renamed from sys_read. (emacs_write): Renamed from sys_write. (sys_siglist): Do not declare if HAVE_STRSIGNAL. (dup2): Do not print error on failure; the real dup2 doesn't. (strsignal): New function, defined if !HAVE_STRSIGNAL. * syssignal.h (SIGINFO): Undef if defined and if BROKEN_SIGINFO is defined. (SIGIO, SIGPOLL, SIGTSTP, SIGURG): Likewise. (NSIG): If less than NSIG_MINIMUM, define to NSIG_MINIMUM. (strsignal): Declare if !HAVE_STRSIGNAL. * unexelf.c (ElfBitsW, ELFSIZE, ElfExpandBitsW): New macros. (ElfW): Define in terms of ElfExpandBitsW. * w32proc.c (sys_siglist): Remove decl. * xdisp.c (decode_mode_spec): 3rd arg is int, not char, to comply with ANSI C. (display_string): Declare face_string_pos arg. * xfns.c (Fx_show_tip): Declare timeout param. * xterm.c: No need to include locale.h. (x_alloc_lighter_color, x_setup_relief_color): Pass arg as double, not float, for compatibility with ANSI C. (fixup_locale): Move to emacs.c. (x_term_init): Do not setlocale or fixup locale; the main program does this now.
author Paul Eggert <eggert@twinsun.com>
date Tue, 19 Oct 1999 07:25:11 +0000
parents 30ffae737755
children b7438760079b
line wrap: on
line diff
--- a/src/callproc.c	Tue Oct 19 07:21:16 1999 +0000
+++ b/src/callproc.c	Tue Oct 19 07:25:11 1999 +0000
@@ -1,5 +1,5 @@
 /* Synchronous subprocess invocation for GNU Emacs.
-   Copyright (C) 1985, 86, 87, 88, 93, 94, 95 Free Software Foundation, Inc.
+   Copyright (C) 1985, 86,87,88,93,94,95, 1999 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -19,10 +19,9 @@
 Boston, MA 02111-1307, USA.  */
 
 
+#include <config.h>
 #include <signal.h>
 #include <errno.h>
-
-#include <config.h>
 #include <stdio.h>
 
 extern int errno;
@@ -134,7 +133,7 @@
 call_process_kill (fdpid)
      Lisp_Object fdpid;
 {
-  close (XFASTINT (Fcar (fdpid)));
+  emacs_close (XFASTINT (Fcar (fdpid)));
   EMACS_KILLPG (XFASTINT (Fcdr (fdpid)), SIGKILL);
   synch_process_alive = 0;
   return Qnil;
@@ -148,7 +147,7 @@
   /* for MSDOS fdpid is really (fd . tempfile)  */
   register Lisp_Object file;
   file = Fcdr (fdpid);
-  close (XFASTINT (Fcar (fdpid)));
+  emacs_close (XFASTINT (Fcar (fdpid)));
   if (strcmp (XSTRING (file)-> data, NULL_DEVICE) != 0)
     unlink (XSTRING (file)->data);
 #else /* not MSDOS and not macintosh */
@@ -156,7 +155,7 @@
 
   if (call_process_exited)
     {
-      close (XFASTINT (Fcar (fdpid)));
+      emacs_close (XFASTINT (Fcar (fdpid)));
       return Qnil;
     }
 
@@ -173,7 +172,7 @@
       message1 ("Waiting for process to die...done");
     }
   synch_process_alive = 0;
-  close (XFASTINT (Fcar (fdpid)));
+  emacs_close (XFASTINT (Fcar (fdpid)));
 #endif /* not MSDOS */
   return Qnil;
 }
@@ -359,7 +358,7 @@
 
   display = nargs >= 4 ? args[3] : Qnil;
 
-  filefd = open (XSTRING (infile)->data, O_RDONLY, 0);
+  filefd = emacs_open (XSTRING (infile)->data, O_RDONLY, 0);
   if (filefd < 0)
     {
       report_file_error ("Opening process input file", Fcons (infile, Qnil));
@@ -374,7 +373,7 @@
   }
   if (NILP (path))
     {
-      close (filefd);
+      emacs_close (filefd);
       report_file_error ("Searching for program", Fcons (args[0], Qnil));
     }
   new_argv[0] = XSTRING (path)->data;
@@ -436,7 +435,7 @@
   outfilefd = creat (tempfile, S_IREAD | S_IWRITE);
   if (outfilefd < 0)
     {
-      close (filefd);
+      emacs_close (filefd);
       report_file_error ("Opening process output file",
 			 Fcons (build_string (tempfile), Qnil));
     }
@@ -465,7 +464,7 @@
 #endif /* macintosh */
 
   if (INTEGERP (buffer))
-    fd[1] = open (NULL_DEVICE, O_WRONLY), fd[0] = -1;
+    fd[1] = emacs_open (NULL_DEVICE, O_WRONLY, 0), fd[0] = -1;
   else
     {
 #ifndef MSDOS
@@ -500,13 +499,13 @@
     synch_process_retcode = 0;
 
     if (NILP (error_file))
-      fd_error = open (NULL_DEVICE, O_WRONLY);
+      fd_error = emacs_open (NULL_DEVICE, O_WRONLY, 0);
     else if (STRINGP (error_file))
       {
 #ifdef DOS_NT
-	fd_error = open (XSTRING (error_file)->data,
-			 O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
-			 S_IREAD | S_IWRITE);
+	fd_error = emacs_open (XSTRING (error_file)->data,
+			       O_WRONLY | O_TRUNC | O_CREAT | O_TEXT,
+			       S_IREAD | S_IWRITE);
 #else  /* not DOS_NT */
 	fd_error = creat (XSTRING (error_file)->data, 0666);
 #endif /* not DOS_NT */
@@ -514,11 +513,11 @@
 
     if (fd_error < 0)
       {
-	close (filefd);
+	emacs_close (filefd);
 	if (fd[0] != filefd)
-	  close (fd[0]);
+	  emacs_close (fd[0]);
 	if (fd1 >= 0)
-	  close (fd1);
+	  emacs_close (fd1);
 #ifdef MSDOS
 	unlink (tempfile);
 #endif
@@ -560,7 +559,10 @@
       synch_process_alive = 0;
       synch_process_retcode = pid;
       if (synch_process_retcode < 0)  /* means it couldn't be exec'ed */
-        synch_process_death = strerror (errno);
+	{
+	  synchronize_messages_locale ();
+	  synch_process_death = strerror (errno);
+	}
 
       /* Since CRLF is converted to LF within `decode_coding', we can
          always open a file with binary mode.  */
@@ -585,19 +587,22 @@
     synch_process_alive = 0;
     synch_process_retcode = pid;
     if (synch_process_retcode < 0)  /* means it couldn't be exec'ed */
-      synch_process_death = strerror (errno);
+      {
+	synchronize_messages_locale ();
+	synch_process_death = strerror (errno);
+      }
 
-    close (outfilefd);
+    emacs_close (outfilefd);
     if (fd_error != outfilefd)
-      close (fd_error);
+      emacs_close (fd_error);
     fd1 = -1; /* No harm in closing that one!  */
     /* Since CRLF is converted to LF within `decode_coding', we can
        always open a file with binary mode.  */
-    fd[0] = open (tempfile, O_BINARY);
+    fd[0] = emacs_open (tempfile, O_RDONLY | O_BINARY, 0);
     if (fd[0] < 0)
       {
 	unlink (tempfile);
-	close (filefd);
+	emacs_close (filefd);
 	report_file_error ("Cannot re-open temporary file", Qnil);
       }
 #else /* not MSDOS */
@@ -610,7 +615,7 @@
     if (pid == 0)
       {
 	if (fd[0] >= 0)
-	  close (fd[0]);
+	  emacs_close (fd[0]);
 #ifdef HAVE_SETSID
         setsid ();
 #endif
@@ -626,7 +631,7 @@
 
     /* The MSDOS case did this already.  */
     if (fd_error >= 0)
-      close (fd_error);
+      emacs_close (fd_error);
 #endif /* not MSDOS */
 #endif /* not macintosh */
 
@@ -634,22 +639,22 @@
 
     /* Close most of our fd's, but not fd[0]
        since we will use that to read input from.  */
-    close (filefd);
+    emacs_close (filefd);
     if (fd1 >= 0 && fd1 != fd_error)
-      close (fd1);
+      emacs_close (fd1);
   }
 
   if (pid < 0)
     {
       if (fd[0] >= 0)
-	close (fd[0]);
+	emacs_close (fd[0]);
       report_file_error ("Doing vfork", Qnil);
     }
 
   if (INTEGERP (buffer))
     {
       if (fd[0] >= 0)
-	close (fd[0]);
+	emacs_close (fd[0]);
 #ifndef subprocesses
       /* If Emacs has been built with asynchronous subprocess support,
 	 we don't need to do this, I think because it will then have
@@ -737,7 +742,8 @@
 	nread = carryover;
 	while (nread < bufsize - 1024)
 	  {
-	    int this_read = read (fd[0], bufptr + nread, bufsize - nread);
+	    int this_read = emacs_read (fd[0], bufptr + nread,
+					bufsize - nread);
 
 	    if (this_read < 0)
 	      goto give_up;
@@ -849,7 +855,8 @@
   unbind_to (count, Qnil);
 
   if (synch_process_death)
-    return build_string (synch_process_death);
+    return code_convert_string_norecord (build_string (synch_process_death),
+					 Vlocale_coding_system, 0);
   return make_number (synch_process_retcode);
 }
 #endif
@@ -1163,16 +1170,16 @@
   }
 
 #ifndef MSDOS
-  close (0);
-  close (1);
-  close (2);
+  emacs_close (0);
+  emacs_close (1);
+  emacs_close (2);
 
   dup2 (in, 0);
   dup2 (out, 1);
   dup2 (err, 2);
-  close (in);
-  close (out);
-  close (err);
+  emacs_close (in);
+  emacs_close (out);
+  emacs_close (err);
 #endif /* not MSDOS */
 #endif /* not WINDOWSNT */
 
@@ -1212,9 +1219,9 @@
   environ = env;
   execvp (new_argv[0], new_argv);
 
-  write (1, "Can't exec program: ", 20);
-  write (1, new_argv[0], strlen (new_argv[0]));
-  write (1, "\n", 1);
+  emacs_write (1, "Can't exec program: ", 20);
+  emacs_write (1, new_argv[0], strlen (new_argv[0]));
+  emacs_write (1, "\n", 1);
   _exit (1);
 #endif /* not WINDOWSNT */
 #endif /* not MSDOS */
@@ -1236,15 +1243,15 @@
 	  char *message1 = "Error while setting up child: ";
 	  char *errmessage = strerror (errno);
 	  char *message2 = "\n";
-	  write (2, message1, strlen (message1));
-	  write (2, errmessage, strlen (errmessage));
-	  write (2, message2, strlen (message2));
+	  emacs_write (2, message1, strlen (message1));
+	  emacs_write (2, errmessage, strlen (errmessage));
+	  emacs_write (2, message2, strlen (message2));
 	  _exit (1);
 	}
       /* Note that we hold the original FD open while we recurse,
 	 to guarantee we'll get a new FD if we need it.  */
       new = relocate_fd (new, minfd);
-      close (fd);
+      emacs_close (fd);
       return new;
     }
 }