aboutsummaryrefslogtreecommitdiffstats
path: root/src/process.c
diff options
context:
space:
mode:
authorEli Zaretskii2014-10-14 21:10:37 +0300
committerEli Zaretskii2014-10-14 21:10:37 +0300
commite3060a0c4d2f418ac786775109d71e5843ccf42e (patch)
tree347b37fc39d0db9cd23b3e9f79ee81b4bbc40f08 /src/process.c
parent1a3eca0656bdb764200e10a4f264138e94b1f3ce (diff)
parent980d78b3587560c13a46aef352ed8d5ed744acf6 (diff)
downloademacs-e3060a0c4d2f418ac786775109d71e5843ccf42e.tar.gz
emacs-e3060a0c4d2f418ac786775109d71e5843ccf42e.zip
Merge from trunk and resolve conflicts.
Diffstat (limited to 'src/process.c')
-rw-r--r--src/process.c126
1 files changed, 66 insertions, 60 deletions
diff --git a/src/process.c b/src/process.c
index 0d6994bdab1..06fc918cf54 100644
--- a/src/process.c
+++ b/src/process.c
@@ -173,6 +173,9 @@ close_on_exec (int fd)
173 return fd; 173 return fd;
174} 174}
175 175
176# undef accept4
177# define accept4(sockfd, addr, addrlen, flags) \
178 process_accept4 (sockfd, addr, addrlen, flags)
176static int 179static int
177accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags) 180accept4 (int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)
178{ 181{
@@ -596,7 +599,7 @@ status_message (struct Lisp_Process *p)
596 Lisp_Object symbol; 599 Lisp_Object symbol;
597 int code; 600 int code;
598 bool coredump; 601 bool coredump;
599 Lisp_Object string, string2; 602 Lisp_Object string;
600 603
601 decode_status (status, &symbol, &code, &coredump); 604 decode_status (status, &symbol, &code, &coredump);
602 605
@@ -620,8 +623,8 @@ status_message (struct Lisp_Process *p)
620 if (c1 != c2) 623 if (c1 != c2)
621 Faset (string, make_number (0), make_number (c2)); 624 Faset (string, make_number (0), make_number (c2));
622 } 625 }
623 string2 = build_string (coredump ? " (core dumped)\n" : "\n"); 626 AUTO_STRING (suffix, coredump ? " (core dumped)\n" : "\n");
624 return concat2 (string, string2); 627 return concat2 (string, suffix);
625 } 628 }
626 else if (EQ (symbol, Qexit)) 629 else if (EQ (symbol, Qexit))
627 { 630 {
@@ -629,17 +632,17 @@ status_message (struct Lisp_Process *p)
629 return build_string (code == 0 ? "deleted\n" : "connection broken by remote peer\n"); 632 return build_string (code == 0 ? "deleted\n" : "connection broken by remote peer\n");
630 if (code == 0) 633 if (code == 0)
631 return build_string ("finished\n"); 634 return build_string ("finished\n");
635 AUTO_STRING (prefix, "exited abnormally with code ");
632 string = Fnumber_to_string (make_number (code)); 636 string = Fnumber_to_string (make_number (code));
633 string2 = build_string (coredump ? " (core dumped)\n" : "\n"); 637 AUTO_STRING (suffix, coredump ? " (core dumped)\n" : "\n");
634 return concat3 (build_string ("exited abnormally with code "), 638 return concat3 (prefix, string, suffix);
635 string, string2);
636 } 639 }
637 else if (EQ (symbol, Qfailed)) 640 else if (EQ (symbol, Qfailed))
638 { 641 {
642 AUTO_STRING (prefix, "failed with code ");
639 string = Fnumber_to_string (make_number (code)); 643 string = Fnumber_to_string (make_number (code));
640 string2 = build_string ("\n"); 644 AUTO_STRING (suffix, "\n");
641 return concat3 (build_string ("failed with code "), 645 return concat3 (prefix, string, suffix);
642 string, string2);
643 } 646 }
644 else 647 else
645 return Fcopy_sequence (Fsymbol_name (symbol)); 648 return Fcopy_sequence (Fsymbol_name (symbol));
@@ -1302,30 +1305,34 @@ Returns nil if format of ADDRESS is invalid. */)
1302 ptrdiff_t size = p->header.size; 1305 ptrdiff_t size = p->header.size;
1303 Lisp_Object args[10]; 1306 Lisp_Object args[10];
1304 int nargs, i; 1307 int nargs, i;
1308 char const *format;
1305 1309
1306 if (size == 4 || (size == 5 && !NILP (omit_port))) 1310 if (size == 4 || (size == 5 && !NILP (omit_port)))
1307 { 1311 {
1308 args[0] = build_string ("%d.%d.%d.%d"); 1312 format = "%d.%d.%d.%d";
1309 nargs = 4; 1313 nargs = 4;
1310 } 1314 }
1311 else if (size == 5) 1315 else if (size == 5)
1312 { 1316 {
1313 args[0] = build_string ("%d.%d.%d.%d:%d"); 1317 format = "%d.%d.%d.%d:%d";
1314 nargs = 5; 1318 nargs = 5;
1315 } 1319 }
1316 else if (size == 8 || (size == 9 && !NILP (omit_port))) 1320 else if (size == 8 || (size == 9 && !NILP (omit_port)))
1317 { 1321 {
1318 args[0] = build_string ("%x:%x:%x:%x:%x:%x:%x:%x"); 1322 format = "%x:%x:%x:%x:%x:%x:%x:%x";
1319 nargs = 8; 1323 nargs = 8;
1320 } 1324 }
1321 else if (size == 9) 1325 else if (size == 9)
1322 { 1326 {
1323 args[0] = build_string ("[%x:%x:%x:%x:%x:%x:%x:%x]:%d"); 1327 format = "[%x:%x:%x:%x:%x:%x:%x:%x]:%d";
1324 nargs = 9; 1328 nargs = 9;
1325 } 1329 }
1326 else 1330 else
1327 return Qnil; 1331 return Qnil;
1328 1332
1333 AUTO_STRING (format_obj, format);
1334 args[0] = format_obj;
1335
1329 for (i = 0; i < nargs; i++) 1336 for (i = 0; i < nargs; i++)
1330 { 1337 {
1331 if (! RANGED_INTEGERP (0, p->contents[i], 65535)) 1338 if (! RANGED_INTEGERP (0, p->contents[i], 65535))
@@ -1339,15 +1346,13 @@ Returns nil if format of ADDRESS is invalid. */)
1339 args[i+1] = p->contents[i]; 1346 args[i+1] = p->contents[i];
1340 } 1347 }
1341 1348
1342 return Fformat (nargs+1, args); 1349 return Fformat (nargs + 1, args);
1343 } 1350 }
1344 1351
1345 if (CONSP (address)) 1352 if (CONSP (address))
1346 { 1353 {
1347 Lisp_Object args[2]; 1354 AUTO_STRING (format, "<Family %d>");
1348 args[0] = build_string ("<Family %d>"); 1355 return Fformat (2, (Lisp_Object []) {format, Fcar (address)});
1349 args[1] = Fcar (address);
1350 return Fformat (2, args);
1351 } 1356 }
1352 1357
1353 return Qnil; 1358 return Qnil;
@@ -1386,9 +1391,10 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */)
1386 (ptrdiff_t nargs, Lisp_Object *args) 1391 (ptrdiff_t nargs, Lisp_Object *args)
1387{ 1392{
1388 Lisp_Object buffer, name, program, proc, current_dir, tem; 1393 Lisp_Object buffer, name, program, proc, current_dir, tem;
1389 register unsigned char **new_argv; 1394 unsigned char **new_argv;
1390 ptrdiff_t i; 1395 ptrdiff_t i;
1391 ptrdiff_t count = SPECPDL_INDEX (); 1396 ptrdiff_t count = SPECPDL_INDEX ();
1397 USE_SAFE_ALLOCA;
1392 1398
1393 buffer = args[1]; 1399 buffer = args[1];
1394 if (!NILP (buffer)) 1400 if (!NILP (buffer))
@@ -1464,7 +1470,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */)
1464 val = Vcoding_system_for_read; 1470 val = Vcoding_system_for_read;
1465 if (NILP (val)) 1471 if (NILP (val))
1466 { 1472 {
1467 args2 = alloca ((nargs + 1) * sizeof *args2); 1473 SAFE_ALLOCA_LISP (args2, nargs + 1);
1468 args2[0] = Qstart_process; 1474 args2[0] = Qstart_process;
1469 for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; 1475 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
1470 GCPRO2 (proc, current_dir); 1476 GCPRO2 (proc, current_dir);
@@ -1483,7 +1489,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */)
1483 { 1489 {
1484 if (EQ (coding_systems, Qt)) 1490 if (EQ (coding_systems, Qt))
1485 { 1491 {
1486 args2 = alloca ((nargs + 1) * sizeof *args2); 1492 SAFE_ALLOCA_LISP (args2, nargs + 1);
1487 args2[0] = Qstart_process; 1493 args2[0] = Qstart_process;
1488 for (i = 0; i < nargs; i++) args2[i + 1] = args[i]; 1494 for (i = 0; i < nargs; i++) args2[i + 1] = args[i];
1489 GCPRO2 (proc, current_dir); 1495 GCPRO2 (proc, current_dir);
@@ -1578,7 +1584,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */)
1578 1584
1579 /* Now that everything is encoded we can collect the strings into 1585 /* Now that everything is encoded we can collect the strings into
1580 NEW_ARGV. */ 1586 NEW_ARGV. */
1581 new_argv = alloca ((nargs - 1) * sizeof *new_argv); 1587 SAFE_NALLOCA (new_argv, 1, nargs - 1);
1582 new_argv[nargs - 2] = 0; 1588 new_argv[nargs - 2] = 0;
1583 1589
1584 for (i = nargs - 2; i-- != 0; ) 1590 for (i = nargs - 2; i-- != 0; )
@@ -1592,6 +1598,7 @@ usage: (start-process NAME BUFFER PROGRAM &rest PROGRAM-ARGS) */)
1592 else 1598 else
1593 create_pty (proc); 1599 create_pty (proc);
1594 1600
1601 SAFE_FREE ();
1595 return unbind_to (count, proc); 1602 return unbind_to (count, proc);
1596} 1603}
1597 1604
@@ -2071,8 +2078,10 @@ get_lisp_to_sockaddr_size (Lisp_Object address, int *familyp)
2071 && VECTORP (XCDR (address))) 2078 && VECTORP (XCDR (address)))
2072 { 2079 {
2073 struct sockaddr *sa; 2080 struct sockaddr *sa;
2074 *familyp = XINT (XCAR (address));
2075 p = XVECTOR (XCDR (address)); 2081 p = XVECTOR (XCDR (address));
2082 if (MAX_ALLOCA - sizeof sa->sa_family < p->header.size)
2083 return 0;
2084 *familyp = XINT (XCAR (address));
2076 return p->header.size + sizeof (sa->sa_family); 2085 return p->header.size + sizeof (sa->sa_family);
2077 } 2086 }
2078 return 0; 2087 return 0;
@@ -2989,7 +2998,7 @@ usage: (make-network-process &rest ARGS) */)
2989 address_un.sun_family = AF_LOCAL; 2998 address_un.sun_family = AF_LOCAL;
2990 if (sizeof address_un.sun_path <= SBYTES (service)) 2999 if (sizeof address_un.sun_path <= SBYTES (service))
2991 error ("Service name too long"); 3000 error ("Service name too long");
2992 strcpy (address_un.sun_path, SSDATA (service)); 3001 lispstpcpy (address_un.sun_path, service);
2993 ai.ai_addr = (struct sockaddr *) &address_un; 3002 ai.ai_addr = (struct sockaddr *) &address_un;
2994 ai.ai_addrlen = sizeof address_un; 3003 ai.ai_addrlen = sizeof address_un;
2995 goto open_socket; 3004 goto open_socket;
@@ -3680,7 +3689,7 @@ network_interface_info (Lisp_Object ifname)
3680 3689
3681 if (sizeof rq.ifr_name <= SBYTES (ifname)) 3690 if (sizeof rq.ifr_name <= SBYTES (ifname))
3682 error ("interface name too long"); 3691 error ("interface name too long");
3683 strcpy (rq.ifr_name, SSDATA (ifname)); 3692 lispstpcpy (rq.ifr_name, ifname);
3684 3693
3685 s = socket (AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0); 3694 s = socket (AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0);
3686 if (s < 0) 3695 if (s < 0)
@@ -4057,20 +4066,15 @@ server_accept_connection (Lisp_Object server, int channel)
4057 { 4066 {
4058 case AF_INET: 4067 case AF_INET:
4059 { 4068 {
4060 Lisp_Object args[5];
4061 unsigned char *ip = (unsigned char *)&saddr.in.sin_addr.s_addr; 4069 unsigned char *ip = (unsigned char *)&saddr.in.sin_addr.s_addr;
4062 args[0] = build_string ("%d.%d.%d.%d");
4063 args[1] = make_number (*ip++);
4064 args[2] = make_number (*ip++);
4065 args[3] = make_number (*ip++);
4066 args[4] = make_number (*ip++);
4067 host = Fformat (5, args);
4068 service = make_number (ntohs (saddr.in.sin_port));
4069 4070
4070 args[0] = build_string (" <%s:%d>"); 4071 AUTO_STRING (ipv4_format, "%d.%d.%d.%d");
4071 args[1] = host; 4072 host = Fformat (5, ((Lisp_Object [])
4072 args[2] = service; 4073 { ipv4_format, make_number (ip[0]),
4073 caller = Fformat (3, args); 4074 make_number (ip[1]), make_number (ip[2]), make_number (ip[3]) }));
4075 service = make_number (ntohs (saddr.in.sin_port));
4076 AUTO_STRING (caller_format, " <%s:%d>");
4077 caller = Fformat (3, (Lisp_Object []) {caller_format, host, service});
4074 } 4078 }
4075 break; 4079 break;
4076 4080
@@ -4080,16 +4084,15 @@ server_accept_connection (Lisp_Object server, int channel)
4080 Lisp_Object args[9]; 4084 Lisp_Object args[9];
4081 uint16_t *ip6 = (uint16_t *)&saddr.in6.sin6_addr; 4085 uint16_t *ip6 = (uint16_t *)&saddr.in6.sin6_addr;
4082 int i; 4086 int i;
4083 args[0] = build_string ("%x:%x:%x:%x:%x:%x:%x:%x"); 4087
4088 AUTO_STRING (ipv6_format, "%x:%x:%x:%x:%x:%x:%x:%x");
4089 args[0] = ipv6_format;
4084 for (i = 0; i < 8; i++) 4090 for (i = 0; i < 8; i++)
4085 args[i+1] = make_number (ntohs (ip6[i])); 4091 args[i + 1] = make_number (ntohs (ip6[i]));
4086 host = Fformat (9, args); 4092 host = Fformat (9, args);
4087 service = make_number (ntohs (saddr.in.sin_port)); 4093 service = make_number (ntohs (saddr.in.sin_port));
4088 4094 AUTO_STRING (caller_format, " <[%s]:%d>");
4089 args[0] = build_string (" <[%s]:%d>"); 4095 caller = Fformat (3, (Lisp_Object []) {caller_format, host, service});
4090 args[1] = host;
4091 args[2] = service;
4092 caller = Fformat (3, args);
4093 } 4096 }
4094 break; 4097 break;
4095#endif 4098#endif
@@ -4099,7 +4102,9 @@ server_accept_connection (Lisp_Object server, int channel)
4099#endif 4102#endif
4100 default: 4103 default:
4101 caller = Fnumber_to_string (make_number (connect_counter)); 4104 caller = Fnumber_to_string (make_number (connect_counter));
4102 caller = concat3 (build_string (" <"), caller, build_string (">")); 4105 AUTO_STRING (space_less_than, " <");
4106 AUTO_STRING (greater_than, ">");
4107 caller = concat3 (space_less_than, caller, greater_than);
4103 break; 4108 break;
4104 } 4109 }
4105 4110
@@ -4196,16 +4201,18 @@ server_accept_connection (Lisp_Object server, int channel)
4196 p->inherit_coding_system_flag 4201 p->inherit_coding_system_flag
4197 = (NILP (buffer) ? 0 : ps->inherit_coding_system_flag); 4202 = (NILP (buffer) ? 0 : ps->inherit_coding_system_flag);
4198 4203
4204 AUTO_STRING (dash, "-");
4205 AUTO_STRING (nl, "\n");
4206 Lisp_Object host_string = STRINGP (host) ? host : dash;
4207
4199 if (!NILP (ps->log)) 4208 if (!NILP (ps->log))
4200 call3 (ps->log, server, proc, 4209 {
4201 concat3 (build_string ("accept from "), 4210 AUTO_STRING (accept_from, "accept from ");
4202 (STRINGP (host) ? host : build_string ("-")), 4211 call3 (ps->log, server, proc, concat3 (accept_from, host_string, nl));
4203 build_string ("\n"))); 4212 }
4204 4213
4205 exec_sentinel (proc, 4214 AUTO_STRING (open_from, "open from ");
4206 concat3 (build_string ("open from "), 4215 exec_sentinel (proc, concat3 (open_from, host_string, nl));
4207 (STRINGP (host) ? host : build_string ("-")),
4208 build_string ("\n")));
4209} 4216}
4210 4217
4211/* This variable is different from waiting_for_input in keyboard.c. 4218/* This variable is different from waiting_for_input in keyboard.c.
@@ -4973,18 +4980,17 @@ read_and_dispose_of_process_output (struct Lisp_Process *p, char *chars,
4973 for decoding. */ 4980 for decoding. */
4974 4981
4975static int 4982static int
4976read_process_output (Lisp_Object proc, register int channel) 4983read_process_output (Lisp_Object proc, int channel)
4977{ 4984{
4978 register ssize_t nbytes; 4985 ssize_t nbytes;
4979 char *chars; 4986 struct Lisp_Process *p = XPROCESS (proc);
4980 register struct Lisp_Process *p = XPROCESS (proc);
4981 struct coding_system *coding = proc_decode_coding_system[channel]; 4987 struct coding_system *coding = proc_decode_coding_system[channel];
4982 int carryover = p->decoding_carryover; 4988 int carryover = p->decoding_carryover;
4983 int readmax = 4096; 4989 enum { readmax = 4096 };
4984 ptrdiff_t count = SPECPDL_INDEX (); 4990 ptrdiff_t count = SPECPDL_INDEX ();
4985 Lisp_Object odeactivate; 4991 Lisp_Object odeactivate;
4992 char chars[sizeof coding->carryover + readmax];
4986 4993
4987 chars = alloca (carryover + readmax);
4988 if (carryover) 4994 if (carryover)
4989 /* See the comment above. */ 4995 /* See the comment above. */
4990 memcpy (chars, SDATA (p->decoding_buf), carryover); 4996 memcpy (chars, SDATA (p->decoding_buf), carryover);
@@ -6837,7 +6843,7 @@ add_timer_wait_descriptor (int fd)
6837{ 6843{
6838 FD_SET (fd, &input_wait_mask); 6844 FD_SET (fd, &input_wait_mask);
6839 FD_SET (fd, &non_keyboard_wait_mask); 6845 FD_SET (fd, &non_keyboard_wait_mask);
6840 FD_SET (fd, &non_process_wait_mask); 6846 FD_SET (fd, &non_process_wait_mask);
6841 fd_callback_info[fd].func = timerfd_callback; 6847 fd_callback_info[fd].func = timerfd_callback;
6842 fd_callback_info[fd].data = NULL; 6848 fd_callback_info[fd].data = NULL;
6843 fd_callback_info[fd].condition |= FOR_READ; 6849 fd_callback_info[fd].condition |= FOR_READ;