X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Frmt.c;h=557b6d4224c8220257e8ee559f41353f5ba23323;hb=2ca2d1cb99ed888aac568bbfb754d0a14af61329;hp=d8aebba3e6b728675a2484dbdb743980e3aac439;hpb=998e6e081d3d19522bde88dfecd96eecd41edf79;p=chaz%2Ftar diff --git a/src/rmt.c b/src/rmt.c index d8aebba..557b6d4 100644 --- a/src/rmt.c +++ b/src/rmt.c @@ -1,5 +1,5 @@ /* Remote connection server. - Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. + Copyright 1994, 1995, 1996, 1997, 1999 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 @@ -13,7 +13,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., - 59 Place - Suite 330, Boston, MA 02111-1307, USA. */ + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* Copyright (C) 1983 Regents of the University of California. All rights reserved. @@ -30,6 +30,7 @@ MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ #include "system.h" +#include "safe-read.h" #include @@ -81,12 +82,12 @@ char *strerror (); static char * private_strerror (int errnum) { - extern const char *const sys_errlist[]; + extern char *sys_errlist[]; extern int sys_nerr; if (errnum > 0 && errnum <= sys_nerr) - return sys_errlist[errnum]; - return N_("Unknown system error"); + return _(sys_errlist[errnum]); + return _("Unknown system error"); } # define strerror private_strerror #endif @@ -101,7 +102,7 @@ report_error_message (const char *string) DEBUG1 ("rmtd: E 0 (%s)\n", string); sprintf (reply_buffer, "E0\n%s\n", string); - write (1, reply_buffer, strlen (reply_buffer)); + full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); } /*---. @@ -114,7 +115,7 @@ report_numbered_error (int num) DEBUG2 ("rmtd: E %d (%s)\n", num, strerror (num)); sprintf (reply_buffer, "E%d\n%s\n", num, strerror (num)); - write (1, reply_buffer, strlen (reply_buffer)); + full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); } /*---. @@ -128,7 +129,7 @@ get_string (char *string) for (counter = 0; counter < STRING_SIZE; counter++) { - if (read (0, string + counter, 1) != 1) + if (safe_read (STDIN_FILENO, string + counter, 1) != 1) exit (EXIT_SUCCESS); if (string[counter] == '\n') @@ -164,7 +165,9 @@ prepare_record_buffer (size_t size) #ifdef SO_RCVBUF while (size > 1024 && - setsockopt (0, SOL_SOCKET, SO_RCVBUF, (char *) &size, sizeof (size)) < 0) + (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! */ @@ -208,7 +211,7 @@ main (int argc, char *const *argv) top: errno = 0; /* FIXME: errno should be read-only */ status = 0; - if (read (0, &command, 1) != 1) + if (safe_read (STDIN_FILENO, &command, 1) != 1) exit (EXIT_SUCCESS); switch (command) @@ -227,34 +230,7 @@ top: if (tape >= 0) close (tape); -#if defined (i386) && defined (AIX) - - /* This is alleged to fix a byte ordering problem. I'm quite - suspicious if it's right. -- mib. */ - - { - mode_t old_mode = atol (mode_string); - mode_t new_mode = 0; - - if ((old_mode & 3) == 0) - new_mode |= O_RDONLY; - if (old_mode & 1) - new_mode |= O_WRONLY; - if (old_mode & 2) - new_mode |= O_RDWR; - if (old_mode & 0x0008) - new_mode |= O_APPEND; - if (old_mode & 0x0200) - new_mode |= O_CREAT; - if (old_mode & 0x0400) - new_mode |= O_TRUNC; - if (old_mode & 0x0800) - new_mode |= O_EXCL; - tape = open (device_string, new_mode, 0666); - } -#else tape = open (device_string, atoi (mode_string), 0666); -#endif if (tape < 0) goto ioerror; goto respond; @@ -279,6 +255,7 @@ top: char position_string[STRING_SIZE]; off_t count = 0; int negative; + int whence; char *p; get_string (count_string); @@ -313,7 +290,16 @@ top: } } - count = lseek (tape, count, atoi (position_string)); + switch (atoi (position_string)) + { + case 0: whence = SEEK_SET; break; + case 1: whence = SEEK_CUR; break; + case 2: whence = SEEK_END; break; + default: + report_error_message (N_("Seek direction out of range")); + exit (EXIT_FAILURE); + } + count = lseek (tape, count, whence); if (count < 0) goto ioerror; @@ -328,7 +314,7 @@ top: DEBUG1 ("rmtd: A %s\n", p); sprintf (reply_buffer, "A%s\n", p); - write (1, reply_buffer, strlen (reply_buffer)); + full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); goto top; } @@ -345,7 +331,8 @@ top: prepare_record_buffer (size); for (counter = 0; counter < size; counter += status) { - status = read (0, &record_buffer[counter], size - counter); + status = safe_read (STDIN_FILENO, &record_buffer[counter], + size - counter); if (status <= 0) { DEBUG (_("rmtd: Premature eof\n")); @@ -354,7 +341,7 @@ top: exit (EXIT_FAILURE); /* exit status used to be 2 */ } } - status = write (tape, record_buffer, size); + status = full_write (tape, record_buffer, size); if (status < 0) goto ioerror; goto respond; @@ -370,12 +357,12 @@ top: size = atol (count_string); prepare_record_buffer (size); - status = read (tape, record_buffer, size); + status = safe_read (tape, record_buffer, size); if (status < 0) goto ioerror; sprintf (reply_buffer, "A%ld\n", status); - write (1, reply_buffer, strlen (reply_buffer)); - write (1, record_buffer, (size_t) status); + full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); + full_write (STDOUT_FILENO, record_buffer, (size_t) status); goto top; } @@ -392,12 +379,12 @@ top: { struct mtop mtop; const char *p; - daddr_t count = 0; + off_t count = 0; int negative; /* Parse count_string, taking care to check for overflow. We can't use standard functions, - since daddr_t might be longer than long. */ + since off_t might be longer than long. */ for (p = count_string; *p == ' ' || *p == '\t'; p++) continue; @@ -412,8 +399,8 @@ top: break; else { - daddr_t c10 = 10 * count; - daddr_t nc = negative ? c10 - digit : c10 + digit; + off_t c10 = 10 * count; + off_t nc = negative ? c10 - digit : c10 + digit; if (c10 / 10 != count || (negative ? c10 < nc : nc < c10)) { report_error_message (N_("Seek offset out of range")); @@ -424,6 +411,11 @@ top: } mtop.mt_count = count; + if (mtop.mt_count != count) + { + report_error_message (N_("Seek offset out of range")); + exit (EXIT_FAILURE); + } mtop.mt_op = atoi (operation_string); if (ioctl (tape, MTIOCTOP, (char *) &mtop) < 0) @@ -445,8 +437,8 @@ top: goto ioerror; status = sizeof (operation); sprintf (reply_buffer, "A%ld\n", status); - write (1, reply_buffer, strlen (reply_buffer)); - write (1, (char *) &operation, sizeof (operation)); + full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); + full_write (STDOUT_FILENO, (char *) &operation, sizeof (operation)); } #endif goto top; @@ -463,7 +455,7 @@ respond: DEBUG1 ("rmtd: A %ld\n", status); sprintf (reply_buffer, "A%ld\n", status); - write (1, reply_buffer, strlen (reply_buffer)); + full_write (STDOUT_FILENO, reply_buffer, strlen (reply_buffer)); goto top; ioerror: