X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Frmt.c;h=9ac327feff23cbd7f5915491f9f722df595c1b32;hb=320298c663ac4849226a2db820bee1bdb75d21ef;hp=e4e8f44bc23e1eb8e99ecbe3420ebdd178220d6d;hpb=aef747068b127bbf136b100db14ff7be5ea1b3aa;p=chaz%2Ftar diff --git a/src/rmt.c b/src/rmt.c index e4e8f44..9ac327f 100644 --- a/src/rmt.c +++ b/src/rmt.c @@ -1,5 +1,7 @@ /* Remote connection server. - Copyright 1994, 1995, 1996, 1997, 1999 Free Software Foundation, Inc. + + Copyright (C) 1994, 1995, 1996, 1997, 1999, 2000, 2001, 2003, 2004 + Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the @@ -30,7 +32,9 @@ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "system.h" -#include "safe-read.h" +#include +#include +#include #include #include @@ -71,10 +75,7 @@ static FILE *debug_file; #define DEBUG2(File, Arg1, Arg2) \ if (debug_file) fprintf(debug_file, File, Arg1, Arg2) -/*------------------------------------------------. -| Return an error string, given an error number. | -`------------------------------------------------*/ - +/* Return an error string, given an error number. */ #if HAVE_STRERROR # ifndef strerror char *strerror (); @@ -93,10 +94,6 @@ private_strerror (int errnum) # define strerror private_strerror #endif -/*---. -| ? | -`---*/ - static void report_error_message (const char *string) { @@ -106,10 +103,6 @@ report_error_message (const char *string) full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); } -/*---. -| ? | -`---*/ - static void report_numbered_error (int num) { @@ -119,32 +112,24 @@ report_numbered_error (int num) full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); } -/*---. -| ? | -`---*/ - static void get_string (char *string) { int counter; - for (counter = 0; counter < STRING_SIZE; counter++) + for (counter = 0; ; counter++) { if (safe_read (STDIN_FILENO, string + counter, 1) != 1) exit (EXIT_SUCCESS); - if (string[counter] == '\n') + if (string[counter] == '\n' || counter == STRING_SIZE - 1) break; } string[counter] = '\0'; } -/*---. -| ? | -`---*/ - static void -prepare_record_buffer (size_t size) +prepare_input_buffer (int fd, size_t size) { if (size <= allocated_size) return; @@ -165,14 +150,14 @@ prepare_record_buffer (size_t size) allocated_size = size; #ifdef SO_RCVBUF - while (size > 1024 && - (setsockopt (STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, - (char *) &size, sizeof size) - < 0)) - size -= 1024; -#else - /* FIXME: I do not see any purpose to the following line... Sigh! */ - size = 1 + ((size - 1) % 1024); + if (0 <= fd) + { + int isize = size < INT_MAX ? size : INT_MAX; + while (setsockopt (fd, SOL_SOCKET, SO_RCVBUF, + (char *) &isize, sizeof isize) + && 1024 < isize) + isize >>= 1; + } #endif } @@ -194,11 +179,11 @@ decode_oflag (char const *oflag_string) char *oflag_num_end; int numeric_oflag = strtol (oflag_string, &oflag_num_end, 10); int symbolic_oflag = 0; - + oflag_string = oflag_num_end; while (ISSPACE ((unsigned char) *oflag_string)) oflag_string++; - + do { struct name_value_pair { char const *name; int value; }; @@ -262,6 +247,8 @@ static struct option const long_opts[] = {0, 0, 0, 0} }; +static void usage (int) __attribute__ ((noreturn)); + static void usage (int status) { @@ -277,21 +264,17 @@ Manipulate a tape drive, accepting commands from a remote process.\n\ --version Output version info.\n\ --help Output this help.\n"), program_name); - fputs (_("\nReport bugs to .\n"), stdout); + printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT); } exit (status); } -/*---. -| ? | -`---*/ - int main (int argc, char *const *argv) { char command; - ssize_t status; + size_t status; /* FIXME: Localization is meaningless, unless --help and --version are locally used. Localization would be best accomplished by the calling @@ -306,17 +289,19 @@ main (int argc, char *const *argv) { default: usage (EXIT_FAILURE); - + case 'h': usage (EXIT_SUCCESS); - + case 'v': - printf ("rmt (GNU %s) %s\n%s\n%s\n", PACKAGE, VERSION, - "Copyright 1999 Free Software Foundation, Inc.", - _("\ + { + printf ("rmt (%s) %s\n%s\n", PACKAGE_NAME, PACKAGE_VERSION, + "Copyright (C) 2004 Free Software Foundation, Inc."); + puts (_("\ This program comes with NO WARRANTY, to the extent permitted by law.\n\ You may redistribute it under the terms of the GNU General Public License;\n\ see the file named COPYING for details.")); + } return EXIT_SUCCESS; case -1: @@ -331,7 +316,7 @@ see the file named COPYING for details.")); if (debug_file == 0) { report_numbered_error (errno); - exit (EXIT_FAILURE); + return EXIT_FAILURE; } setbuf (debug_file, 0); } @@ -412,7 +397,7 @@ top: if (c10 / 10 != count || (negative ? c10 < nc : nc < c10)) { report_error_message (N_("Seek offset out of range")); - exit (EXIT_FAILURE); + return EXIT_FAILURE; } count = nc; } @@ -425,7 +410,7 @@ top: case 2: whence = SEEK_END; break; default: report_error_message (N_("Seek direction out of range")); - exit (EXIT_FAILURE); + return EXIT_FAILURE; } count = lseek (tape, count, whence); if (count < 0) @@ -438,7 +423,7 @@ top: do *--p = '0' + (int) (count % 10); while ((count /= 10) != 0); - + DEBUG1 ("rmtd: A %s\n", p); sprintf (reply_buffer, "A%s\n", p); @@ -456,21 +441,21 @@ top: size = atol (count_string); DEBUG1 ("rmtd: W %s\n", count_string); - prepare_record_buffer (size); + prepare_input_buffer (STDIN_FILENO, size); for (counter = 0; counter < size; counter += status) { status = safe_read (STDIN_FILENO, &record_buffer[counter], size - counter); - if (status <= 0) + if (status == SAFE_READ_ERROR || status == 0) { DEBUG (_("rmtd: Premature eof\n")); report_error_message (N_("Premature end of file")); - exit (EXIT_FAILURE); /* exit status used to be 2 */ + return EXIT_FAILURE; /* exit status used to be 2 */ } } status = full_write (tape, record_buffer, size); - if (status < 0) + if (status != size) goto ioerror; goto respond; } @@ -484,11 +469,11 @@ top: DEBUG1 ("rmtd: R %s\n", count_string); size = atol (count_string); - prepare_record_buffer (size); + prepare_input_buffer (-1, size); status = safe_read (tape, record_buffer, size); - if (status < 0) + if (status == SAFE_READ_ERROR) goto ioerror; - sprintf (reply_buffer, "A%ld\n", (long) status); + sprintf (reply_buffer, "A%lu\n", (unsigned long int) status); full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); full_write (STDOUT_FILENO, record_buffer, status); goto top; @@ -513,13 +498,13 @@ top: /* Parse count_string, taking care to check for overflow. We can't use standard functions, since off_t might be longer than long. */ - + for (p = count_string; *p == ' ' || *p == '\t'; p++) continue; - + negative = *p == '-'; p += negative || *p == '+'; - + for (;;) { int digit = *p++ - '0'; @@ -532,7 +517,7 @@ top: if (c10 / 10 != count || (negative ? c10 < nc : nc < c10)) { report_error_message (N_("Seek offset out of range")); - exit (EXIT_FAILURE); + return EXIT_FAILURE; } count = nc; } @@ -542,7 +527,7 @@ top: if (mtop.mt_count != count) { report_error_message (N_("Seek offset out of range")); - exit (EXIT_FAILURE); + return EXIT_FAILURE; } mtop.mt_op = atoi (operation_string); @@ -576,7 +561,7 @@ top: DEBUG1 (_("rmtd: Garbage command %c\n"), command); report_error_message (N_("Garbage command")); - exit (EXIT_FAILURE); /* exit status used to be 3 */ + return EXIT_FAILURE; /* exit status used to be 3 */ } respond: