OLD | NEW |
1 /* Host file transfer support for gdbserver. | 1 /* Host file transfer support for gdbserver. |
2 Copyright (C) 2007-2012 Free Software Foundation, Inc. | 2 Copyright (C) 2007-2012 Free Software Foundation, Inc. |
3 | 3 |
4 Contributed by CodeSourcery. | 4 Contributed by CodeSourcery. |
5 | 5 |
6 This file is part of GDB. | 6 This file is part of GDB. |
7 | 7 |
8 This program is free software; you can redistribute it and/or modify | 8 This program is free software; you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation; either version 3 of the License, or | 10 the Free Software Foundation; either version 3 of the License, or |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 || require_end (p)) | 321 || require_end (p)) |
322 { | 322 { |
323 hostio_packet_error (own_buf); | 323 hostio_packet_error (own_buf); |
324 return; | 324 return; |
325 } | 325 } |
326 | 326 |
327 data = xmalloc (len); | 327 data = xmalloc (len); |
328 #ifdef HAVE_PREAD | 328 #ifdef HAVE_PREAD |
329 ret = pread (fd, data, len, offset); | 329 ret = pread (fd, data, len, offset); |
330 #else | 330 #else |
331 ret = lseek (fd, offset, SEEK_SET); | 331 ret = -1; |
332 if (ret != -1) | |
333 ret = read (fd, data, len); | |
334 #endif | 332 #endif |
| 333 /* If we have no pread or it failed for this file, use lseek/read. */ |
| 334 if (ret == -1) |
| 335 { |
| 336 ret = lseek (fd, offset, SEEK_SET); |
| 337 if (ret != -1) |
| 338 ret = read (fd, data, len); |
| 339 } |
335 | 340 |
336 if (ret == -1) | 341 if (ret == -1) |
337 { | 342 { |
338 hostio_error (own_buf); | 343 hostio_error (own_buf); |
339 free (data); | 344 free (data); |
340 return; | 345 return; |
341 } | 346 } |
342 | 347 |
343 bytes_sent = hostio_reply_with_data (own_buf, data, ret, new_packet_len); | 348 bytes_sent = hostio_reply_with_data (own_buf, data, ret, new_packet_len); |
344 | 349 |
(...skipping 24 matching lines...) Expand all Loading... |
369 || require_comma (&p) | 374 || require_comma (&p) |
370 || require_data (p, packet_len - (p - own_buf), &data, &len)) | 375 || require_data (p, packet_len - (p - own_buf), &data, &len)) |
371 { | 376 { |
372 hostio_packet_error (own_buf); | 377 hostio_packet_error (own_buf); |
373 return; | 378 return; |
374 } | 379 } |
375 | 380 |
376 #ifdef HAVE_PWRITE | 381 #ifdef HAVE_PWRITE |
377 ret = pwrite (fd, data, len, offset); | 382 ret = pwrite (fd, data, len, offset); |
378 #else | 383 #else |
379 ret = lseek (fd, offset, SEEK_SET); | 384 ret = -1; |
380 if (ret != -1) | |
381 ret = write (fd, data, len); | |
382 #endif | 385 #endif |
| 386 /* If we have no pwrite or it failed for this file, use lseek/write. */ |
| 387 if (ret == -1) |
| 388 { |
| 389 ret = lseek (fd, offset, SEEK_SET); |
| 390 if (ret != -1) |
| 391 ret = write (fd, data, len); |
| 392 } |
383 | 393 |
384 if (ret == -1) | 394 if (ret == -1) |
385 { | 395 { |
386 hostio_error (own_buf); | 396 hostio_error (own_buf); |
387 free (data); | 397 free (data); |
388 return; | 398 return; |
389 } | 399 } |
390 | 400 |
391 hostio_reply (own_buf, ret); | 401 hostio_reply (own_buf, ret); |
392 free (data); | 402 free (data); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
449 | 459 |
450 if (ret == -1) | 460 if (ret == -1) |
451 { | 461 { |
452 hostio_error (own_buf); | 462 hostio_error (own_buf); |
453 return; | 463 return; |
454 } | 464 } |
455 | 465 |
456 hostio_reply (own_buf, ret); | 466 hostio_reply (own_buf, ret); |
457 } | 467 } |
458 | 468 |
| 469 static void |
| 470 handle_readlink (char *own_buf, int *new_packet_len) |
| 471 { |
| 472 #if defined (HAVE_READLINK) |
| 473 char filename[PATH_MAX], linkname[PATH_MAX]; |
| 474 char *p; |
| 475 int ret, bytes_sent; |
| 476 |
| 477 p = own_buf + strlen ("vFile:readlink:"); |
| 478 |
| 479 if (require_filename (&p, filename) |
| 480 || require_end (p)) |
| 481 { |
| 482 hostio_packet_error (own_buf); |
| 483 return; |
| 484 } |
| 485 |
| 486 ret = readlink (filename, linkname, sizeof linkname); |
| 487 if (ret == -1) |
| 488 { |
| 489 hostio_error (own_buf); |
| 490 return; |
| 491 } |
| 492 |
| 493 bytes_sent = hostio_reply_with_data (own_buf, linkname, ret, new_packet_len); |
| 494 |
| 495 /* If the response does not fit into a single packet, do not attempt |
| 496 to return a partial response, but simply fail. */ |
| 497 if (bytes_sent < ret) |
| 498 sprintf (own_buf, "F-1,%x", FILEIO_ENAMETOOLONG); |
| 499 #else /* ! HAVE_READLINK */ |
| 500 sprintf (own_buf, "F-1,%x", FILEIO_ENOSYS); |
| 501 #endif |
| 502 } |
| 503 |
459 /* Handle all the 'F' file transfer packets. */ | 504 /* Handle all the 'F' file transfer packets. */ |
460 | 505 |
461 int | 506 int |
462 handle_vFile (char *own_buf, int packet_len, int *new_packet_len) | 507 handle_vFile (char *own_buf, int packet_len, int *new_packet_len) |
463 { | 508 { |
464 if (strncmp (own_buf, "vFile:open:", 11) == 0) | 509 if (strncmp (own_buf, "vFile:open:", 11) == 0) |
465 handle_open (own_buf); | 510 handle_open (own_buf); |
466 else if (strncmp (own_buf, "vFile:pread:", 11) == 0) | 511 else if (strncmp (own_buf, "vFile:pread:", 11) == 0) |
467 handle_pread (own_buf, new_packet_len); | 512 handle_pread (own_buf, new_packet_len); |
468 else if (strncmp (own_buf, "vFile:pwrite:", 12) == 0) | 513 else if (strncmp (own_buf, "vFile:pwrite:", 12) == 0) |
469 handle_pwrite (own_buf, packet_len); | 514 handle_pwrite (own_buf, packet_len); |
470 else if (strncmp (own_buf, "vFile:close:", 12) == 0) | 515 else if (strncmp (own_buf, "vFile:close:", 12) == 0) |
471 handle_close (own_buf); | 516 handle_close (own_buf); |
472 else if (strncmp (own_buf, "vFile:unlink:", 13) == 0) | 517 else if (strncmp (own_buf, "vFile:unlink:", 13) == 0) |
473 handle_unlink (own_buf); | 518 handle_unlink (own_buf); |
| 519 else if (strncmp (own_buf, "vFile:readlink:", 15) == 0) |
| 520 handle_readlink (own_buf, new_packet_len); |
474 else | 521 else |
475 return 0; | 522 return 0; |
476 | 523 |
477 return 1; | 524 return 1; |
478 } | 525 } |
OLD | NEW |