X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Frtapelib.c;h=1e044295fad810b3c327d0264c917eef2ba59b2a;hb=3030a247b1e0d4ab25261107bed5ff4afb644b84;hp=8ec2f81df3bfbcab493cfc7420fd565889a86022;hpb=c9f5ead8dec28ea7b774184f3c22e9b02ac6f8e2;p=chaz%2Ftar diff --git a/src/rtapelib.c b/src/rtapelib.c index 8ec2f81..1e04429 100644 --- a/src/rtapelib.c +++ b/src/rtapelib.c @@ -1,5 +1,7 @@ /* Functions for communicating with a remote tape drive. - Copyright 1988, 1992, 1994, 1996, 1997, 1999 Free Software Foundation, Inc. + + Copyright 1988, 1992, 1994, 1996, 1997, 1999, 2000, 2001 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 @@ -32,8 +34,8 @@ #include "system.h" -#include "basename.h" -#include "safe-read.h" +#include +#include /* Try hard to get EOPNOTSUPP defined. 486/ISC has it in net/errno.h, 3B2/SVR3 has it in sys/inet.h. Otherwise, like on MSDOS, use EINVAL. */ @@ -58,9 +60,6 @@ #include "rmt.h" -/* FIXME: Just to shut up -Wall. */ -int rexec (); - /* Exit status if exec errors. */ #define EXIT_ON_EXEC_ERROR 128 @@ -93,10 +92,7 @@ static int to_remote[MAXUNIT][2] = {{-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}}; char *rmt_path__; -/*----------------------------------------------------------------------. -| Close remote tape connection HANDLE, and reset errno to ERRNO_VALUE. | -`----------------------------------------------------------------------*/ - +/* Close remote tape connection HANDLE, and reset errno to ERRNO_VALUE. */ static void _rmt_shutdown (int handle, int errno_value) { @@ -107,30 +103,24 @@ _rmt_shutdown (int handle, int errno_value) errno = errno_value; } -/*-------------------------------------------------------------------------. -| Attempt to perform the remote tape command specified in BUFFER on remote | -| tape connection HANDLE. Return 0 if successful, -1 on error. | -`-------------------------------------------------------------------------*/ - +/* Attempt to perform the remote tape command specified in BUFFER on + remote tape connection HANDLE. Return 0 if successful, -1 on + error. */ static int do_command (int handle, const char *buffer) { - size_t length; - RETSIGTYPE (*pipe_handler) (); - /* Save the current pipe handler and try to make the request. */ - pipe_handler = signal (SIGPIPE, SIG_IGN); - length = strlen (buffer); - if (full_write (WRITE_SIDE (handle), buffer, length) == length) - { - signal (SIGPIPE, pipe_handler); - return 0; - } + size_t length = strlen (buffer); + RETSIGTYPE (*pipe_handler) () = signal (SIGPIPE, SIG_IGN); + ssize_t written = full_write (WRITE_SIDE (handle), buffer, length); + signal (SIGPIPE, pipe_handler); + + if (written == length) + return 0; /* Something went wrong. Close down and go home. */ - signal (SIGPIPE, pipe_handler); _rmt_shutdown (handle, EIO); return -1; } @@ -207,11 +197,8 @@ get_status_string (int handle, char *command_buffer) return cursor + 1; } -/*----------------------------------------------------------------------. -| Read and return the status from remote tape connection HANDLE. If an | -| error occurred, return -1 and set errno. | -`----------------------------------------------------------------------*/ - +/* Read and return the status from remote tape connection HANDLE. If + an error occurred, return -1 and set errno. */ static long get_status (int handle) { @@ -264,18 +251,15 @@ get_status_off (int handle) #if WITH_REXEC -/*-------------------------------------------------------------------------. -| Execute /etc/rmt as user USER on remote system HOST using rexec. Return | -| a file descriptor of a bidirectional socket for stdin and stdout. If | -| USER is zero, use the current username. | -| | -| By default, this code is not used, since it requires that the user have | -| a .netrc file in his/her home directory, or that the application | -| designer be willing to have rexec prompt for login and password info. | -| This may be unacceptable, and .rhosts files for use with rsh are much | -| more common on BSD systems. | -`-------------------------------------------------------------------------*/ +/* Execute /etc/rmt as user USER on remote system HOST using rexec. + Return a file descriptor of a bidirectional socket for stdin and + stdout. If USER is zero, use the current username. + By default, this code is not used, since it requires that the user + have a .netrc file in his/her home directory, or that the + application designer be willing to have rexec prompt for login and + password info. This may be unacceptable, and .rhosts files for use + with rsh are much more common on BSD systems. */ static int _rmt_rexec (char *host, char *user) { @@ -328,7 +312,9 @@ encode_oflag (char *buf, int oflag) default: abort (); } +#ifdef O_APPEND if (oflag & O_APPEND) strcat (buf, "|O_APPEND"); +#endif if (oflag & O_CREAT) strcat (buf, "|O_CREAT"); #ifdef O_DSYNC if (oflag & O_DSYNC) strcat (buf, "|O_DSYNC"); @@ -352,13 +338,11 @@ encode_oflag (char *buf, int oflag) if (oflag & O_TRUNC) strcat (buf, "|O_TRUNC"); } -/*------------------------------------------------------------------------. -| Open a file (a magnetic tape device?) on the system specified in PATH, | -| as the given user. PATH has the form `[USER@]HOST:FILE'. OPEN_MODE is | -| O_RDONLY, O_WRONLY, etc. If successful, return the remote pipe number | -| plus BIAS. REMOTE_SHELL may be overridden. On error, return -1. | -`------------------------------------------------------------------------*/ - +/* Open a file (a magnetic tape device?) on the system specified in + PATH, as the given user. PATH has the form `[USER@]HOST:FILE'. + OPEN_MODE is O_RDONLY, O_WRONLY, etc. If successful, return the + remote pipe number plus BIAS. REMOTE_SHELL may be overridden. On + error, return -1. */ int rmt_open__ (const char *path, int open_mode, int bias, const char *remote_shell) { @@ -498,10 +482,7 @@ rmt_open__ (const char *path, int open_mode, int bias, const char *remote_shell) close (from_remote[remote_pipe_number][PREAD]); close (from_remote[remote_pipe_number][PWRITE]); -#if !MSDOS - setuid (getuid ()); - setgid (getgid ()); -#endif + sys_reset_uid_gid (); if (remote_user) execl (remote_shell, remote_shell_basename, remote_host, @@ -547,11 +528,8 @@ rmt_open__ (const char *path, int open_mode, int bias, const char *remote_shell) return remote_pipe_number + bias; } -/*----------------------------------------------------------------. -| Close remote tape connection HANDLE and shut down. Return 0 if | -| successful, -1 on error. | -`----------------------------------------------------------------*/ - +/* Close remote tape connection HANDLE and shut down. Return 0 if + successful, -1 on error. */ int rmt_close__ (int handle) { @@ -565,11 +543,8 @@ rmt_close__ (int handle) return status; } -/*-------------------------------------------------------------------------. -| Read up to LENGTH bytes into BUFFER from remote tape connection HANDLE. | -| Return the number of bytes read on success, -1 on error. | -`-------------------------------------------------------------------------*/ - +/* Read up to LENGTH bytes into BUFFER from remote tape connection HANDLE. + Return the number of bytes read on success, -1 on error. */ ssize_t rmt_read__ (int handle, char *buffer, size_t length) { @@ -595,40 +570,33 @@ rmt_read__ (int handle, char *buffer, size_t length) return status; } -/*-------------------------------------------------------------------------. -| Write LENGTH bytes from BUFFER to remote tape connection HANDLE. Return | -| the number of bytes written on success, -1 on error. | -`-------------------------------------------------------------------------*/ - +/* Write LENGTH bytes from BUFFER to remote tape connection HANDLE. + Return the number of bytes written on success, -1 on error. */ ssize_t rmt_write__ (int handle, char *buffer, size_t length) { char command_buffer[COMMAND_BUFFER_SIZE]; RETSIGTYPE (*pipe_handler) (); + size_t written; sprintf (command_buffer, "W%lu\n", (unsigned long) length); if (do_command (handle, command_buffer) == -1) return -1; pipe_handler = signal (SIGPIPE, SIG_IGN); - if (full_write (WRITE_SIDE (handle), buffer, length) == length) - { - signal (SIGPIPE, pipe_handler); - return get_status (handle); - } + written = full_write (WRITE_SIDE (handle), buffer, length); + signal (SIGPIPE, pipe_handler); + if (written == length) + return get_status (handle); /* Write error. */ - signal (SIGPIPE, pipe_handler); _rmt_shutdown (handle, EIO); return -1; } -/*------------------------------------------------------------------------. -| Perform an imitation lseek operation on remote tape connection HANDLE. | -| Return the new file offset if successful, -1 if on error. | -`------------------------------------------------------------------------*/ - +/* Perform an imitation lseek operation on remote tape connection + HANDLE. Return the new file offset if successful, -1 if on error. */ off_t rmt_lseek__ (int handle, off_t offset, int whence) { @@ -637,6 +605,7 @@ rmt_lseek__ (int handle, off_t offset, int whence) uintmax_t u = offset < 0 ? - (uintmax_t) offset : (uintmax_t) offset; char *p = operand_buffer + sizeof operand_buffer; + *--p = 0; do *--p = '0' + (int) (u % 10); while ((u /= 10) != 0); @@ -659,11 +628,8 @@ rmt_lseek__ (int handle, off_t offset, int whence) return get_status_off (handle); } -/*-----------------------------------------------------------------------. -| Perform a raw tape operation on remote tape connection HANDLE. Return | -| the results of the ioctl, or -1 on error. | -`-----------------------------------------------------------------------*/ - +/* Perform a raw tape operation on remote tape connection HANDLE. + Return the results of the ioctl, or -1 on error. */ int rmt_ioctl__ (int handle, int operation, char *argument) { @@ -683,6 +649,7 @@ rmt_ioctl__ (int handle, int operation, char *argument) : (uintmax_t) ((struct mtop *) argument)->mt_count); char *p = operand_buffer + sizeof operand_buffer; + *--p = 0; do *--p = '0' + (int) (u % 10); while ((u /= 10) != 0);