OLD | NEW |
1 /* Remote utility routines for the remote server for GDB. | 1 /* Remote utility routines for the remote server for GDB. |
2 Copyright (C) 1986, 1989, 1993-2012 Free Software Foundation, Inc. | 2 Copyright (C) 1986, 1989, 1993-2012 Free Software Foundation, Inc. |
3 | 3 |
4 This file is part of GDB. | 4 This file is part of GDB. |
5 | 5 |
6 This program is free software; you can redistribute it and/or modify | 6 This program is free software; you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation; either version 3 of the License, or | 8 the Free Software Foundation; either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
11 This program is distributed in the hope that it will be useful, | 11 This program is distributed in the hope that it will be useful, |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 GNU General Public License for more details. | 14 GNU General Public License for more details. |
15 | 15 |
16 You should have received a copy of the GNU General Public License | 16 You should have received a copy of the GNU General Public License |
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ | 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
18 | 18 |
19 #include "server.h" | 19 #include "server.h" |
20 #include "terminal.h" | 20 #include "terminal.h" |
21 #include "target.h" | 21 #include "target.h" |
| 22 #include "gdbthread.h" |
22 #include <stdio.h> | 23 #include <stdio.h> |
23 #include <string.h> | 24 #include <string.h> |
24 #if HAVE_SYS_IOCTL_H | 25 #if HAVE_SYS_IOCTL_H |
25 #include <sys/ioctl.h> | 26 #include <sys/ioctl.h> |
26 #endif | 27 #endif |
27 #if HAVE_SYS_FILE_H | 28 #if HAVE_SYS_FILE_H |
28 #include <sys/file.h> | 29 #include <sys/file.h> |
29 #endif | 30 #endif |
30 #if HAVE_NETINET_IN_H | 31 #if HAVE_NETINET_IN_H |
31 #include <netinet/in.h> | 32 #include <netinet/in.h> |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 struct sym_cache | 99 struct sym_cache |
99 { | 100 { |
100 char *name; | 101 char *name; |
101 CORE_ADDR addr; | 102 CORE_ADDR addr; |
102 struct sym_cache *next; | 103 struct sym_cache *next; |
103 }; | 104 }; |
104 | 105 |
105 int remote_debug = 0; | 106 int remote_debug = 0; |
106 struct ui_file *gdb_stdlog; | 107 struct ui_file *gdb_stdlog; |
107 | 108 |
| 109 static int remote_is_stdio = 0; |
| 110 |
108 static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR; | 111 static gdb_fildes_t remote_desc = INVALID_DESCRIPTOR; |
109 static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; | 112 static gdb_fildes_t listen_desc = INVALID_DESCRIPTOR; |
110 | 113 |
111 /* FIXME headerize? */ | 114 /* FIXME headerize? */ |
112 extern int using_threads; | 115 extern int using_threads; |
113 extern int debug_threads; | 116 extern int debug_threads; |
114 | 117 |
115 /* If true, then GDB has requested noack mode. */ | 118 /* If true, then GDB has requested noack mode. */ |
116 int noack_mode = 0; | 119 int noack_mode = 0; |
117 /* If true, then we tell GDB to use noack mode by default. */ | 120 /* If true, then we tell GDB to use noack mode by default. */ |
118 int transport_is_reliable = 0; | 121 int transport_is_reliable = 0; |
119 | 122 |
120 #ifdef USE_WIN32API | 123 #ifdef USE_WIN32API |
121 # define read(fd, buf, len) recv (fd, (char *) buf, len, 0) | 124 # define read(fd, buf, len) recv (fd, (char *) buf, len, 0) |
122 # define write(fd, buf, len) send (fd, (char *) buf, len, 0) | 125 # define write(fd, buf, len) send (fd, (char *) buf, len, 0) |
123 #endif | 126 #endif |
124 | 127 |
125 int | 128 int |
126 gdb_connected (void) | 129 gdb_connected (void) |
127 { | 130 { |
128 return remote_desc != INVALID_DESCRIPTOR; | 131 return remote_desc != INVALID_DESCRIPTOR; |
129 } | 132 } |
130 | 133 |
| 134 /* Return true if the remote connection is over stdio. */ |
| 135 |
| 136 int |
| 137 remote_connection_is_stdio (void) |
| 138 { |
| 139 return remote_is_stdio; |
| 140 } |
| 141 |
131 static void | 142 static void |
132 enable_async_notification (int fd) | 143 enable_async_notification (int fd) |
133 { | 144 { |
134 #if defined(F_SETFL) && defined (FASYNC) | 145 #if defined(F_SETFL) && defined (FASYNC) |
135 int save_fcntl_flags; | 146 int save_fcntl_flags; |
136 | 147 |
137 save_fcntl_flags = fcntl (fd, F_GETFL, 0); | 148 save_fcntl_flags = fcntl (fd, F_GETFL, 0); |
138 fcntl (fd, F_SETFL, save_fcntl_flags | FASYNC); | 149 fcntl (fd, F_SETFL, save_fcntl_flags | FASYNC); |
139 #if defined (F_SETOWN) | 150 #if defined (F_SETOWN) |
140 fcntl (fd, F_SETOWN, getpid ()); | 151 fcntl (fd, F_SETOWN, getpid ()); |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 { | 224 { |
214 char *port_str; | 225 char *port_str; |
215 #ifdef USE_WIN32API | 226 #ifdef USE_WIN32API |
216 static int winsock_initialized; | 227 static int winsock_initialized; |
217 #endif | 228 #endif |
218 int port; | 229 int port; |
219 struct sockaddr_in sockaddr; | 230 struct sockaddr_in sockaddr; |
220 socklen_t tmp; | 231 socklen_t tmp; |
221 char *port_end; | 232 char *port_end; |
222 | 233 |
| 234 remote_is_stdio = 0; |
| 235 if (strcmp (name, STDIO_CONNECTION_NAME) == 0) |
| 236 { |
| 237 /* We need to record fact that we're using stdio sooner than the |
| 238 call to remote_open so start_inferior knows the connection is |
| 239 via stdio. */ |
| 240 remote_is_stdio = 1; |
| 241 transport_is_reliable = 1; |
| 242 return; |
| 243 } |
| 244 |
223 port_str = strchr (name, ':'); | 245 port_str = strchr (name, ':'); |
224 if (port_str == NULL) | 246 if (port_str == NULL) |
225 { | 247 { |
226 transport_is_reliable = 0; | 248 transport_is_reliable = 0; |
227 return; | 249 return; |
228 } | 250 } |
229 | 251 |
230 port = strtoul (port_str + 1, &port_end, 10); | 252 port = strtoul (port_str + 1, &port_end, 10); |
231 if (port_str[1] == '\0' || *port_end != '\0') | 253 if (port_str[1] == '\0' || *port_end != '\0') |
232 fatal ("Bad port argument: %s", name); | 254 fatal ("Bad port argument: %s", name); |
(...skipping 30 matching lines...) Expand all Loading... |
263 | 285 |
264 /* Open a connection to a remote debugger. | 286 /* Open a connection to a remote debugger. |
265 NAME is the filename used for communication. */ | 287 NAME is the filename used for communication. */ |
266 | 288 |
267 void | 289 void |
268 remote_open (char *name) | 290 remote_open (char *name) |
269 { | 291 { |
270 char *port_str; | 292 char *port_str; |
271 | 293 |
272 port_str = strchr (name, ':'); | 294 port_str = strchr (name, ':'); |
| 295 #ifdef USE_WIN32API |
273 if (port_str == NULL) | 296 if (port_str == NULL) |
| 297 error ("Only <host>:<port> is supported on this platform."); |
| 298 #endif |
| 299 |
| 300 if (strcmp (name, STDIO_CONNECTION_NAME) == 0) |
274 { | 301 { |
275 #ifdef USE_WIN32API | 302 fprintf (stderr, "Remote debugging using stdio\n"); |
276 error ("Only <host>:<port> is supported on this platform."); | 303 |
277 #else | 304 /* Use stdin as the handle of the connection. |
| 305 » We only select on reads, for example. */ |
| 306 remote_desc = fileno (stdin); |
| 307 |
| 308 enable_async_notification (remote_desc); |
| 309 |
| 310 /* Register the event loop handler. */ |
| 311 add_file_handler (remote_desc, handle_serial_event, NULL); |
| 312 } |
| 313 #ifndef USE_WIN32API |
| 314 else if (port_str == NULL) |
| 315 { |
278 struct stat statbuf; | 316 struct stat statbuf; |
279 | 317 |
280 if (stat (name, &statbuf) == 0 | 318 if (stat (name, &statbuf) == 0 |
281 && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))) | 319 && (S_ISCHR (statbuf.st_mode) || S_ISFIFO (statbuf.st_mode))) |
282 remote_desc = open (name, O_RDWR); | 320 remote_desc = open (name, O_RDWR); |
283 else | 321 else |
284 { | 322 { |
285 errno = EINVAL; | 323 errno = EINVAL; |
286 remote_desc = -1; | 324 remote_desc = -1; |
287 } | 325 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 ioctl (remote_desc, TIOCSETP, &sg); | 370 ioctl (remote_desc, TIOCSETP, &sg); |
333 } | 371 } |
334 #endif | 372 #endif |
335 | 373 |
336 fprintf (stderr, "Remote debugging using %s\n", name); | 374 fprintf (stderr, "Remote debugging using %s\n", name); |
337 | 375 |
338 enable_async_notification (remote_desc); | 376 enable_async_notification (remote_desc); |
339 | 377 |
340 /* Register the event loop handler. */ | 378 /* Register the event loop handler. */ |
341 add_file_handler (remote_desc, handle_serial_event, NULL); | 379 add_file_handler (remote_desc, handle_serial_event, NULL); |
| 380 } |
342 #endif /* USE_WIN32API */ | 381 #endif /* USE_WIN32API */ |
343 } | |
344 else | 382 else |
345 { | 383 { |
346 int port; | 384 int port; |
347 socklen_t len; | 385 socklen_t len; |
348 struct sockaddr_in sockaddr; | 386 struct sockaddr_in sockaddr; |
349 | 387 |
350 len = sizeof (sockaddr); | 388 len = sizeof (sockaddr); |
351 if (getsockname (listen_desc, | 389 if (getsockname (listen_desc, |
352 (struct sockaddr *) &sockaddr, &len) < 0 | 390 (struct sockaddr *) &sockaddr, &len) < 0 |
353 || len < sizeof (sockaddr)) | 391 || len < sizeof (sockaddr)) |
354 perror_with_name ("Can't determine port"); | 392 perror_with_name ("Can't determine port"); |
355 port = ntohs (sockaddr.sin_port); | 393 port = ntohs (sockaddr.sin_port); |
356 | 394 |
357 fprintf (stderr, "Listening on port %d\n", port); | 395 fprintf (stderr, "Listening on port %d\n", port); |
358 fflush (stderr); | 396 fflush (stderr); |
359 | 397 |
360 /* Register the event loop handler. */ | 398 /* Register the event loop handler. */ |
361 add_file_handler (listen_desc, handle_accept_event, NULL); | 399 add_file_handler (listen_desc, handle_accept_event, NULL); |
362 } | 400 } |
363 } | 401 } |
364 | 402 |
365 void | 403 void |
366 remote_close (void) | 404 remote_close (void) |
367 { | 405 { |
368 delete_file_handler (remote_desc); | 406 delete_file_handler (remote_desc); |
369 | 407 |
370 #ifdef USE_WIN32API | 408 #ifdef USE_WIN32API |
371 closesocket (remote_desc); | 409 closesocket (remote_desc); |
372 #else | 410 #else |
373 close (remote_desc); | 411 if (! remote_connection_is_stdio ()) |
| 412 close (remote_desc); |
374 #endif | 413 #endif |
375 remote_desc = INVALID_DESCRIPTOR; | 414 remote_desc = INVALID_DESCRIPTOR; |
376 | 415 |
377 reset_readchar (); | 416 reset_readchar (); |
378 } | 417 } |
379 | 418 |
380 /* Convert hex digit A to a number. */ | 419 /* Convert hex digit A to a number. */ |
381 | 420 |
382 static int | 421 static int |
383 fromhex (int a) | 422 fromhex (int a) |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
722 | 761 |
723 /* Since the stub is not sending a process id, then default to | 762 /* Since the stub is not sending a process id, then default to |
724 what's in the current inferior. */ | 763 what's in the current inferior. */ |
725 pid = ptid_get_pid (((struct inferior_list_entry *) current_inferior)->id); | 764 pid = ptid_get_pid (((struct inferior_list_entry *) current_inferior)->id); |
726 | 765 |
727 if (obuf) | 766 if (obuf) |
728 *obuf = pp; | 767 *obuf = pp; |
729 return ptid_build (pid, tid, 0); | 768 return ptid_build (pid, tid, 0); |
730 } | 769 } |
731 | 770 |
| 771 /* Write COUNT bytes in BUF to the client. |
| 772 The result is the number of bytes written or -1 if error. |
| 773 This may return less than COUNT. */ |
| 774 |
| 775 static int |
| 776 write_prim (const void *buf, int count) |
| 777 { |
| 778 if (remote_connection_is_stdio ()) |
| 779 return write (fileno (stdout), buf, count); |
| 780 else |
| 781 return write (remote_desc, buf, count); |
| 782 } |
| 783 |
| 784 /* Read COUNT bytes from the client and store in BUF. |
| 785 The result is the number of bytes read or -1 if error. |
| 786 This may return less than COUNT. */ |
| 787 |
| 788 static int |
| 789 read_prim (void *buf, int count) |
| 790 { |
| 791 if (remote_connection_is_stdio ()) |
| 792 return read (fileno (stdin), buf, count); |
| 793 else |
| 794 return read (remote_desc, buf, count); |
| 795 } |
| 796 |
732 /* Send a packet to the remote machine, with error checking. | 797 /* Send a packet to the remote machine, with error checking. |
733 The data of the packet is in BUF, and the length of the | 798 The data of the packet is in BUF, and the length of the |
734 packet is in CNT. Returns >= 0 on success, -1 otherwise. */ | 799 packet is in CNT. Returns >= 0 on success, -1 otherwise. */ |
735 | 800 |
736 static int | 801 static int |
737 putpkt_binary_1 (char *buf, int cnt, int is_notif) | 802 putpkt_binary_1 (char *buf, int cnt, int is_notif) |
738 { | 803 { |
739 int i; | 804 int i; |
740 unsigned char csum = 0; | 805 unsigned char csum = 0; |
741 char *buf2; | 806 char *buf2; |
(...skipping 17 matching lines...) Expand all Loading... |
759 *p++ = '#'; | 824 *p++ = '#'; |
760 *p++ = tohex ((csum >> 4) & 0xf); | 825 *p++ = tohex ((csum >> 4) & 0xf); |
761 *p++ = tohex (csum & 0xf); | 826 *p++ = tohex (csum & 0xf); |
762 | 827 |
763 *p = '\0'; | 828 *p = '\0'; |
764 | 829 |
765 /* Send it over and over until we get a positive ack. */ | 830 /* Send it over and over until we get a positive ack. */ |
766 | 831 |
767 do | 832 do |
768 { | 833 { |
769 if (write (remote_desc, buf2, p - buf2) != p - buf2) | 834 if (write_prim (buf2, p - buf2) != p - buf2) |
770 { | 835 { |
771 perror ("putpkt(write)"); | 836 perror ("putpkt(write)"); |
772 free (buf2); | 837 free (buf2); |
773 return -1; | 838 return -1; |
774 } | 839 } |
775 | 840 |
776 if (noack_mode || is_notif) | 841 if (noack_mode || is_notif) |
777 { | 842 { |
778 /* Don't expect an ack then. */ | 843 /* Don't expect an ack then. */ |
779 if (remote_debug) | 844 if (remote_debug) |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 /* Protect against spurious interrupts. This has been observed to | 919 /* Protect against spurious interrupts. This has been observed to |
855 be a problem under NetBSD 1.4 and 1.5. */ | 920 be a problem under NetBSD 1.4 and 1.5. */ |
856 | 921 |
857 FD_ZERO (&readset); | 922 FD_ZERO (&readset); |
858 FD_SET (remote_desc, &readset); | 923 FD_SET (remote_desc, &readset); |
859 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0) | 924 if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0) |
860 { | 925 { |
861 int cc; | 926 int cc; |
862 char c = 0; | 927 char c = 0; |
863 | 928 |
864 cc = read (remote_desc, &c, 1); | 929 cc = read_prim (&c, 1); |
865 | 930 |
866 if (cc != 1 || c != '\003' || current_inferior == NULL) | 931 if (cc != 1 || c != '\003' || current_inferior == NULL) |
867 { | 932 { |
868 fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n", | 933 fprintf (stderr, "input_interrupt, count = %d c = %d ('%c')\n", |
869 cc, c, c); | 934 cc, c, c); |
870 return; | 935 return; |
871 } | 936 } |
872 | 937 |
873 (*the_target->request_interrupt) (); | 938 (*the_target->request_interrupt) (); |
874 } | 939 } |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 | 1047 |
983 /* Returns next char from remote GDB. -1 if error. */ | 1048 /* Returns next char from remote GDB. -1 if error. */ |
984 | 1049 |
985 static int | 1050 static int |
986 readchar (void) | 1051 readchar (void) |
987 { | 1052 { |
988 int ch; | 1053 int ch; |
989 | 1054 |
990 if (readchar_bufcnt == 0) | 1055 if (readchar_bufcnt == 0) |
991 { | 1056 { |
992 readchar_bufcnt = read (remote_desc, readchar_buf, | 1057 readchar_bufcnt = read_prim (readchar_buf, sizeof (readchar_buf)); |
993 » » » sizeof (readchar_buf)); | |
994 | 1058 |
995 if (readchar_bufcnt <= 0) | 1059 if (readchar_bufcnt <= 0) |
996 { | 1060 { |
997 if (readchar_bufcnt == 0) | 1061 if (readchar_bufcnt == 0) |
998 fprintf (stderr, "readchar: Got EOF\n"); | 1062 fprintf (stderr, "readchar: Got EOF\n"); |
999 else | 1063 else |
1000 perror ("readchar"); | 1064 perror ("readchar"); |
1001 | 1065 |
1002 return -1; | 1066 return -1; |
1003 } | 1067 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1105 fprintf (stderr, | 1169 fprintf (stderr, |
1106 "Bad checksum, sentsum=0x%x, csum=0x%x, " | 1170 "Bad checksum, sentsum=0x%x, csum=0x%x, " |
1107 "buf=%s [no-ack-mode, Bad medium?]\n", | 1171 "buf=%s [no-ack-mode, Bad medium?]\n", |
1108 (c1 << 4) + c2, csum, buf); | 1172 (c1 << 4) + c2, csum, buf); |
1109 /* Not much we can do, GDB wasn't expecting an ack/nac. */ | 1173 /* Not much we can do, GDB wasn't expecting an ack/nac. */ |
1110 break; | 1174 break; |
1111 } | 1175 } |
1112 | 1176 |
1113 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", | 1177 fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n", |
1114 (c1 << 4) + c2, csum, buf); | 1178 (c1 << 4) + c2, csum, buf); |
1115 if (write (remote_desc, "-", 1) != 1) | 1179 if (write_prim ("-", 1) != 1) |
1116 return -1; | 1180 return -1; |
1117 } | 1181 } |
1118 | 1182 |
1119 if (!noack_mode) | 1183 if (!noack_mode) |
1120 { | 1184 { |
1121 if (remote_debug) | 1185 if (remote_debug) |
1122 { | 1186 { |
1123 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf); | 1187 fprintf (stderr, "getpkt (\"%s\"); [sending ack] \n", buf); |
1124 fflush (stderr); | 1188 fflush (stderr); |
1125 } | 1189 } |
1126 | 1190 |
1127 if (write (remote_desc, "+", 1) != 1) | 1191 if (write_prim ("+", 1) != 1) |
1128 return -1; | 1192 return -1; |
1129 | 1193 |
1130 if (remote_debug) | 1194 if (remote_debug) |
1131 { | 1195 { |
1132 fprintf (stderr, "[sent ack]\n"); | 1196 fprintf (stderr, "[sent ack]\n"); |
1133 fflush (stderr); | 1197 fflush (stderr); |
1134 } | 1198 } |
1135 } | 1199 } |
1136 else | 1200 else |
1137 { | 1201 { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 disable_async_io (); | 1307 disable_async_io (); |
1244 putpkt (own_buf); | 1308 putpkt (own_buf); |
1245 enable_async_io (); | 1309 enable_async_io (); |
1246 } | 1310 } |
1247 | 1311 |
1248 void | 1312 void |
1249 prepare_resume_reply (char *buf, ptid_t ptid, | 1313 prepare_resume_reply (char *buf, ptid_t ptid, |
1250 struct target_waitstatus *status) | 1314 struct target_waitstatus *status) |
1251 { | 1315 { |
1252 if (debug_threads) | 1316 if (debug_threads) |
1253 fprintf (stderr, "Writing resume reply for %s:%d\n\n", | 1317 fprintf (stderr, "Writing resume reply for %s:%d\n", |
1254 target_pid_to_str (ptid), status->kind); | 1318 target_pid_to_str (ptid), status->kind); |
1255 | 1319 |
1256 switch (status->kind) | 1320 switch (status->kind) |
1257 { | 1321 { |
1258 case TARGET_WAITKIND_STOPPED: | 1322 case TARGET_WAITKIND_STOPPED: |
1259 { | 1323 { |
1260 struct thread_info *saved_inferior; | 1324 struct thread_info *saved_inferior; |
1261 const char **regp; | 1325 const char **regp; |
1262 struct regcache *regcache; | 1326 struct regcache *regcache; |
1263 | 1327 |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1320 /* In non-stop, don't change the general thread behind | 1384 /* In non-stop, don't change the general thread behind |
1321 GDB's back. */ | 1385 GDB's back. */ |
1322 if (!non_stop) | 1386 if (!non_stop) |
1323 general_thread = ptid; | 1387 general_thread = ptid; |
1324 sprintf (buf, "thread:"); | 1388 sprintf (buf, "thread:"); |
1325 buf += strlen (buf); | 1389 buf += strlen (buf); |
1326 buf = write_ptid (buf, ptid); | 1390 buf = write_ptid (buf, ptid); |
1327 strcat (buf, ";"); | 1391 strcat (buf, ";"); |
1328 buf += strlen (buf); | 1392 buf += strlen (buf); |
1329 | 1393 |
1330 » » if (the_target->core_of_thread) | 1394 » » core = target_core_of_thread (ptid); |
1331 » » core = (*the_target->core_of_thread) (ptid); | 1395 |
1332 if (core != -1) | 1396 if (core != -1) |
1333 { | 1397 { |
1334 sprintf (buf, "core:"); | 1398 sprintf (buf, "core:"); |
1335 buf += strlen (buf); | 1399 buf += strlen (buf); |
1336 sprintf (buf, "%x", core); | 1400 sprintf (buf, "%x", core); |
1337 strcat (buf, ";"); | 1401 strcat (buf, ";"); |
1338 buf += strlen (buf); | 1402 buf += strlen (buf); |
1339 } | 1403 } |
1340 } | 1404 } |
1341 } | 1405 } |
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1706 char *buf = xmalloc (strlen (msg) * 2 + 2); | 1770 char *buf = xmalloc (strlen (msg) * 2 + 2); |
1707 | 1771 |
1708 buf[0] = 'O'; | 1772 buf[0] = 'O'; |
1709 hexify (buf + 1, msg, 0); | 1773 hexify (buf + 1, msg, 0); |
1710 | 1774 |
1711 putpkt (buf); | 1775 putpkt (buf); |
1712 free (buf); | 1776 free (buf); |
1713 } | 1777 } |
1714 | 1778 |
1715 #endif | 1779 #endif |
OLD | NEW |