diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2016-06-09 21:58:16 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2016-06-09 21:58:53 -0700 |
commit | 560202f67513327f5b262e01ebc709ab6855d6f6 (patch) | |
tree | 282f79044a059e8bc028b5a24109bdde749e921f | |
parent | 48079f68125e75cf581ef2b86b00c5a3851dd6e7 (diff) |
Fix XFASTINT of non-fixnum in process status
* src/process.c (decode_status): 3rd arg is now Lisp_Object *,
not int *, and is not decoded. All uses changed.
(status_message): Do not assume ‘failed’ code is an integer.
* src/process.h: Document codes better.
-rw-r--r-- | src/process.c | 26 | ||||
-rw-r--r-- | src/process.h | 3 |
2 files changed, 15 insertions, 14 deletions
diff --git a/src/process.c b/src/process.c index 9ca3e59435..5e06ccccac 100644 --- a/src/process.c +++ b/src/process.c @@ -537,21 +537,22 @@ status_convert (int w) and store them individually through the three pointers. */ static void -decode_status (Lisp_Object l, Lisp_Object *symbol, int *code, bool *coredump) +decode_status (Lisp_Object l, Lisp_Object *symbol, Lisp_Object *code, + bool *coredump) { Lisp_Object tem; if (SYMBOLP (l)) { *symbol = l; - *code = 0; + *code = make_number (0); *coredump = 0; } else { *symbol = XCAR (l); tem = XCDR (l); - *code = XFASTINT (XCAR (tem)); + *code = XCAR (tem); tem = XCDR (tem); *coredump = !NILP (tem); } @@ -563,8 +564,7 @@ static Lisp_Object status_message (struct Lisp_Process *p) { Lisp_Object status = p->status; - Lisp_Object symbol; - int code; + Lisp_Object symbol, code; bool coredump; Lisp_Object string; @@ -574,7 +574,7 @@ status_message (struct Lisp_Process *p) { char const *signame; synchronize_system_messages_locale (); - signame = strsignal (code); + signame = strsignal (XFASTINT (code)); if (signame == 0) string = build_string ("unknown"); else @@ -596,20 +596,20 @@ status_message (struct Lisp_Process *p) else if (EQ (symbol, Qexit)) { if (NETCONN1_P (p)) - return build_string (code == 0 ? "deleted\n" : "connection broken by remote peer\n"); - if (code == 0) + return build_string (XFASTINT (code) == 0 + ? "deleted\n" + : "connection broken by remote peer\n"); + if (XFASTINT (code) == 0) return build_string ("finished\n"); AUTO_STRING (prefix, "exited abnormally with code "); - string = Fnumber_to_string (make_number (code)); + string = Fnumber_to_string (code); AUTO_STRING (suffix, coredump ? " (core dumped)\n" : "\n"); return concat3 (prefix, string, suffix); } else if (EQ (symbol, Qfailed)) { - AUTO_STRING (prefix, "failed with code "); - string = Fnumber_to_string (make_number (code)); - AUTO_STRING (suffix, "\n"); - return concat3 (prefix, string, suffix); + AUTO_STRING (format, "failed with code %s\n"); + return CALLN (Fformat, format, code); } else return Fcopy_sequence (Fsymbol_name (symbol)); diff --git a/src/process.h b/src/process.h index a5f690dc55..4430377877 100644 --- a/src/process.h +++ b/src/process.h @@ -83,7 +83,8 @@ struct Lisp_Process Lisp_Object mark; /* Symbol indicating status of process. - This may be a symbol: run, open, or closed. + This may be a symbol: run, open, closed, listen, connect, or failed. + Or it may be (failed ERR) where ERR is an integer, string or symbol. Or it may be a list, whose car is stop, exit or signal and whose cdr is a pair (EXIT_CODE . COREDUMP_FLAG) or (SIGNAL_NUMBER . COREDUMP_FLAG). */ |