aboutsummaryrefslogtreecommitdiffstats
path: root/src/sysdep.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sysdep.c')
-rw-r--r--src/sysdep.c85
1 files changed, 64 insertions, 21 deletions
diff --git a/src/sysdep.c b/src/sysdep.c
index faca7fae461..6346b0bbfcd 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -31,7 +31,6 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
31#include <unistd.h> 31#include <unistd.h>
32 32
33#include <c-ctype.h> 33#include <c-ctype.h>
34#include <ignore-value.h>
35#include <utimens.h> 34#include <utimens.h>
36 35
37#include "lisp.h" 36#include "lisp.h"
@@ -538,8 +537,8 @@ sys_subshell (void)
538 if (str && chdir ((char *) str) != 0) 537 if (str && chdir ((char *) str) != 0)
539 { 538 {
540#ifndef DOS_NT 539#ifndef DOS_NT
541 ignore_value (write (1, "Can't chdir\n", 12)); 540 emacs_perror ((char *) str);
542 _exit (1); 541 _exit (EXIT_CANCELED);
543#endif 542#endif
544 } 543 }
545 544
@@ -570,8 +569,8 @@ sys_subshell (void)
570 write (1, "Can't execute subshell", 22); 569 write (1, "Can't execute subshell", 22);
571#else /* not WINDOWSNT */ 570#else /* not WINDOWSNT */
572 execlp (sh, sh, (char *) 0); 571 execlp (sh, sh, (char *) 0);
573 ignore_value (write (1, "Can't execute subshell", 22)); 572 emacs_perror (sh);
574 _exit (1); 573 _exit (errno == ENOENT ? EXIT_ENOENT : EXIT_CANNOT_INVOKE);
575#endif /* not WINDOWSNT */ 574#endif /* not WINDOWSNT */
576#endif /* not MSDOS */ 575#endif /* not MSDOS */
577 } 576 }
@@ -2134,10 +2133,10 @@ emacs_backtrace (int backtrace_limit)
2134 2133
2135 if (npointers) 2134 if (npointers)
2136 { 2135 {
2137 ignore_value (write (STDERR_FILENO, "\nBacktrace:\n", 12)); 2136 emacs_write (STDERR_FILENO, "\nBacktrace:\n", 12);
2138 backtrace_symbols_fd (buffer, npointers, STDERR_FILENO); 2137 backtrace_symbols_fd (buffer, npointers, STDERR_FILENO);
2139 if (bounded_limit < npointers) 2138 if (bounded_limit < npointers)
2140 ignore_value (write (STDERR_FILENO, "...\n", 4)); 2139 emacs_write (STDERR_FILENO, "...\n", 4);
2141 } 2140 }
2142} 2141}
2143 2142
@@ -2246,27 +2245,26 @@ emacs_read (int fildes, char *buf, ptrdiff_t nbyte)
2246} 2245}
2247 2246
2248/* Write to FILEDES from a buffer BUF with size NBYTE, retrying if interrupted 2247/* Write to FILEDES from a buffer BUF with size NBYTE, retrying if interrupted
2249 or if a partial write occurs. Return the number of bytes written, setting 2248 or if a partial write occurs. If interrupted, process pending
2249 signals if PROCESS SIGNALS. Return the number of bytes written, setting
2250 errno if this is less than NBYTE. */ 2250 errno if this is less than NBYTE. */
2251ptrdiff_t 2251static ptrdiff_t
2252emacs_write (int fildes, const char *buf, ptrdiff_t nbyte) 2252emacs_full_write (int fildes, char const *buf, ptrdiff_t nbyte,
2253 bool process_signals)
2253{ 2254{
2254 ssize_t rtnval; 2255 ptrdiff_t bytes_written = 0;
2255 ptrdiff_t bytes_written;
2256
2257 bytes_written = 0;
2258 2256
2259 while (nbyte > 0) 2257 while (nbyte > 0)
2260 { 2258 {
2261 rtnval = write (fildes, buf, min (nbyte, MAX_RW_COUNT)); 2259 ssize_t n = write (fildes, buf, min (nbyte, MAX_RW_COUNT));
2262 2260
2263 if (rtnval < 0) 2261 if (n < 0)
2264 { 2262 {
2265 if (errno == EINTR) 2263 if (errno == EINTR)
2266 { 2264 {
2267 /* I originally used `QUIT' but that might causes files to 2265 /* I originally used `QUIT' but that might causes files to
2268 be truncated if you hit C-g in the middle of it. --Stef */ 2266 be truncated if you hit C-g in the middle of it. --Stef */
2269 if (pending_signals) 2267 if (process_signals && pending_signals)
2270 process_pending_signals (); 2268 process_pending_signals ();
2271 continue; 2269 continue;
2272 } 2270 }
@@ -2274,12 +2272,57 @@ emacs_write (int fildes, const char *buf, ptrdiff_t nbyte)
2274 break; 2272 break;
2275 } 2273 }
2276 2274
2277 buf += rtnval; 2275 buf += n;
2278 nbyte -= rtnval; 2276 nbyte -= n;
2279 bytes_written += rtnval; 2277 bytes_written += n;
2280 } 2278 }
2281 2279
2282 return (bytes_written); 2280 return bytes_written;
2281}
2282
2283/* Write to FILEDES from a buffer BUF with size NBYTE, retrying if
2284 interrupted or if a partial write occurs. Return the number of
2285 bytes written, setting errno if this is less than NBYTE. */
2286ptrdiff_t
2287emacs_write (int fildes, char const *buf, ptrdiff_t nbyte)
2288{
2289 return emacs_full_write (fildes, buf, nbyte, 0);
2290}
2291
2292/* Like emacs_write, but also process pending signals if interrupted. */
2293ptrdiff_t
2294emacs_write_sig (int fildes, char const *buf, ptrdiff_t nbyte)
2295{
2296 return emacs_full_write (fildes, buf, nbyte, 1);
2297}
2298
2299/* Write a diagnostic to standard error that contains MESSAGE and a
2300 string derived from errno. Preserve errno. Do not buffer stderr.
2301 Do not process pending signals if interrupted. */
2302void
2303emacs_perror (char const *message)
2304{
2305 int err = errno;
2306 char const *error_string = strerror (err);
2307 char const *command = (initial_argv && initial_argv[0]
2308 ? initial_argv[0] : "emacs");
2309 /* Write it out all at once, if it's short; this is less likely to
2310 be interleaved with other output. */
2311 char buf[BUFSIZ];
2312 int nbytes = snprintf (buf, sizeof buf, "%s: %s: %s\n",
2313 command, message, error_string);
2314 if (0 <= nbytes && nbytes < BUFSIZ)
2315 emacs_write (STDERR_FILENO, buf, nbytes);
2316 else
2317 {
2318 emacs_write (STDERR_FILENO, command, strlen (command));
2319 emacs_write (STDERR_FILENO, ": ", 2);
2320 emacs_write (STDERR_FILENO, message, strlen (message));
2321 emacs_write (STDERR_FILENO, ": ", 2);
2322 emacs_write (STDERR_FILENO, error_string, strlen (error_string));
2323 emacs_write (STDERR_FILENO, "\n", 1);
2324 }
2325 errno = err;
2283} 2326}
2284 2327
2285/* Return a struct timeval that is roughly equivalent to T. 2328/* Return a struct timeval that is roughly equivalent to T.