Mercurial > emacs
diff src/sysdep.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 | b0d0bcf1b32e |
| children | b7438760079b |
line wrap: on
line diff
--- a/src/sysdep.c Tue Oct 19 07:21:16 1999 +0000 +++ b/src/sysdep.c Tue Oct 19 07:25:11 1999 +0000 @@ -1,5 +1,5 @@ /* Interfaces to system-dependent kernel and library entries. - 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,13 +19,10 @@ Boston, MA 02111-1307, USA. */ +#include <config.h> #include <signal.h> #include <setjmp.h> -#include <config.h> -#ifdef STDC_HEADERS -#include <stdlib.h> -#endif #include "lisp.h" #include "blockinput.h" #undef NULL @@ -50,18 +47,6 @@ #define min(x,y) ((x) > (y) ? (y) : (x)) -/* In this file, open, read and write refer to the system calls, - not our sugared interfaces sys_open, sys_read and sys_write. - Contrariwise, for systems where we use the system calls directly, - define sys_read, etc. here as aliases for them. */ -#ifndef read -#define sys_read read -#define sys_write write -#endif /* `read' is not a macro */ - -#undef read -#undef write - #ifdef WINDOWSNT #define read _read #define write _write @@ -69,18 +54,6 @@ extern int errno; #endif /* not WINDOWSNT */ -#ifndef close -#define sys_close close -#else -#undef close -#endif - -#ifndef open -#define sys_open open -#else /* `open' is a macro */ -#undef open -#endif /* `open' is a macro */ - /* Does anyone other than VMS need this? */ #ifndef fwrite #define sys_fwrite fwrite @@ -2710,25 +2683,6 @@ #endif /* not MSDOS */ #ifdef BSD4_1 -/* - * Partially emulate 4.2 open call. - * open is defined as this in 4.1. - * - * - added by Michael Bloom @ Citicorp/TTI - * - */ - -int -sys_open (path, oflag, mode) - char *path; - int oflag, mode; -{ - if (oflag & O_CREAT) - return creat (path, mode); - else - return open (path, oflag); -} - void init_sigio (fd) int fd; @@ -3093,27 +3047,25 @@ #endif /* not WINDOWSNT */ #endif /* ! HAVE_STRERROR */ -#ifdef INTERRUPTIBLE_OPEN - int -/* VARARGS 2 */ -sys_open (path, oflag, mode) +emacs_open (path, oflag, mode) char *path; int oflag, mode; { register int rtnval; + +#ifdef BSD4_1 + if (oflag & O_CREAT) + return creat (path, mode); +#endif while ((rtnval = open (path, oflag, mode)) == -1 && (errno == EINTR)); return (rtnval); } -#endif /* INTERRUPTIBLE_OPEN */ - -#ifdef INTERRUPTIBLE_CLOSE - int -sys_close (fd) +emacs_close (fd) int fd; { int did_retry = 0; @@ -3132,12 +3084,8 @@ return rtnval; } -#endif /* INTERRUPTIBLE_CLOSE */ - -#ifdef INTERRUPTIBLE_IO - int -sys_read (fildes, buf, nbyte) +emacs_read (fildes, buf, nbyte) int fildes; char *buf; unsigned int nbyte; @@ -3150,7 +3098,7 @@ } int -sys_write (fildes, buf, nbyte) +emacs_write (fildes, buf, nbyte) int fildes; char *buf; unsigned int nbyte; @@ -3177,8 +3125,6 @@ } return (bytes_written); } - -#endif /* INTERRUPTIBLE_IO */ #ifndef HAVE_VFORK #ifndef WINDOWSNT @@ -3210,6 +3156,7 @@ * always negligible. Fred Fish, Unisoft Systems Inc. */ +#ifndef HAVE_STRSIGNAL #ifndef HAVE_SYS_SIGLIST char *sys_siglist[NSIG + 1] = { @@ -3296,6 +3243,7 @@ 0 }; #endif /* HAVE_SYS_SIGLIST */ +#endif /* HAVE_STRSIGNAL */ /* * Warning, this function may not duplicate 4.2 action properly @@ -3384,12 +3332,10 @@ { register int fd, ret; - sys_close (newd); + emacs_close (newd); #ifdef F_DUPFD - fd = fcntl (oldd, F_DUPFD, newd); - if (fd != newd) - error ("can't dup2 (%i,%i) : %s", oldd, newd, strerror (errno)); + return fcntl (oldd, F_DUPFD, newd); #else fd = dup (old); if (fd == -1) @@ -3397,7 +3343,7 @@ if (fd == new) return new; ret = dup2 (old,new); - sys_close (fd); + emacs_close (fd); return ret; #endif } @@ -3452,6 +3398,7 @@ #ifdef DGUX +#ifndef HAVE_STRSIGNAL char *sys_siglist[NSIG + 1] = { "null signal", /* 0 SIGNULL */ @@ -3521,6 +3468,7 @@ "notification message in mess. queue", /* 64 SIGDGNOTIFY */ 0 }; +#endif /* HAVE_STRSIGNAL */ #endif /* DGUX */ @@ -3538,7 +3486,7 @@ { int rtnval; - rtnval = sys_close (dirp->dd_fd); + rtnval = emacs_close (dirp->dd_fd); /* Some systems (like Solaris) allocate the buffer and the DIR all in one block. Why in the world are we freeing this ourselves @@ -3563,7 +3511,7 @@ register int fd; /* file descriptor for read */ struct stat sbuf; /* result of fstat */ - fd = sys_open (filename, 0); + fd = emacs_open (filename, O_RDONLY, 0); if (fd < 0) return 0; @@ -3572,7 +3520,7 @@ || (sbuf.st_mode & S_IFMT) != S_IFDIR || (dirp = (DIR *) malloc (sizeof (DIR))) == 0) { - sys_close (fd); + emacs_close (fd); UNBLOCK_INPUT; return 0; /* bad luck today */ } @@ -3588,7 +3536,7 @@ closedir (dirp) register DIR *dirp; /* stream from opendir */ { - sys_close (dirp->dd_fd); + emacs_close (dirp->dd_fd); xfree ((char *) dirp); } @@ -3622,7 +3570,7 @@ dirp->dd_loc = dirp->dd_size = 0; if (dirp->dd_size == 0 /* refill buffer */ - && (dirp->dd_size = sys_read (dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ)) <= 0) + && (dirp->dd_size = emacs_read (dirp->dd_fd, dirp->dd_buf, DIRBLKSIZ)) <= 0) return 0; #ifndef VMS @@ -3775,7 +3723,7 @@ */ status = umask (0); /* Get current umask */ status = umask (status | (0777 & ~dmode)); /* Set for mkdir */ - fd = sys_open ("/dev/null", 2); + fd = emacs_open ("/dev/null", O_RDWR, 0); if (fd >= 0) { dup2 (fd, 0); @@ -3821,7 +3769,7 @@ return (-1); /* Errno is set already */ case 0: /* Child process */ - fd = sys_open ("/dev/null", 2); + fd = emacs_open ("/dev/null", O_RDWR, 0); if (fd >= 0) { dup2 (fd, 0); @@ -4240,6 +4188,7 @@ return (getgid () << 16) | getuid (); } +#undef read int sys_read (fildes, buf, nbyte) int fildes; @@ -4279,6 +4228,7 @@ * Thus we do this stupidity below. */ +#undef write int sys_write (fildes, buf, nbytes) int fildes; @@ -5322,7 +5272,28 @@ } #endif /* no bcmp */ #endif /* not BSTRING */ - + +#ifndef HAVE_STRSIGNAL +char * +strsignal (code) + int code; +{ + char *signame = 0; + + if (0 <= code && code < NSIG) + { +#ifdef VMS + signame = sys_errlist[code]; +#else + /* Cast to suppress warning if the table has const char *. */ + signame = (char *) sys_siglist[code]; +#endif + } + + return signame; +} +#endif /* HAVE_STRSIGNAL */ + /* All the Macintosh stuffs go here */ #ifdef macintosh @@ -5502,10 +5473,10 @@ /* Define our own stat function for both MrC and CW. The reason for doing this: "stat" is both the name of a struct and function name: - can't use the same trick like that for sys_open, sys_close, etc. to + we can't #define stat to something else to redirect Emacs's calls to our own version that converts Unix style filenames to Mac style filename because all sorts of compilation - errors will be generated if stat is #define'd to be sys_stat. */ + errors will be generated if stat is #define'd to be something else. */ int stat (const char *path, struct stat *buf)
