char *xstrdup ();
enum backup_type get_version ();
int eaccess_stat ();
+int full_write ();
static int do_copy ();
static int copy ();
int dest_desc;
int source_desc;
int n_read;
- int n_written;
struct stat sb;
char *cp;
int *ip;
n_read = read (source_desc, buf, buf_size);
if (n_read < 0)
{
+#ifdef EINTR
+ if (errno == EINTR)
+ continue;
+#endif
error (0, errno, "%s", src_path);
return_val = -1;
goto ret;
}
if (ip == 0)
{
- n_written = write (dest_desc, buf, n_read);
- if (n_written < n_read)
+ if (full_write (dest_desc, buf, n_read) < 0)
{
error (0, errno, "%s", dst_path);
return_val = -1;
{
#ifdef HAVE_FTRUNCATE
/* Write a null character and truncate it again. */
- if (write (dest_desc, "", 1) != 1
+ if (full_write (dest_desc, "", 1) < 0
|| ftruncate (dest_desc, n_read_total) < 0)
#else
/* Seek backwards one character and write a null. */
if (lseek (dest_desc, (off_t) -1, SEEK_CUR) < 0L
- || write (dest_desc, "", 1) != 1)
+ || full_write (dest_desc, "", 1) < 0)
#endif
{
error (0, errno, "%s", dst_path);
char *xmalloc ();
void error ();
+int safe_read ();
static RETSIGTYPE interrupt_handler ();
static int bit_count ();
{
while (records-- > 0)
{
- if (read (fdesc, buf, blocksize) < 0)
+ if (read (fdesc, buf, blocksize) < 0
+#ifdef EINTR
+ && errno != EINTR
+#endif
+ )
{
error (0, errno, "%s", file);
quit (1);
if ((conversions_mask & C_SYNC) && (conversions_mask & C_NOERROR))
bzero (ibuf, input_blocksize);
- nread = read (input_fd, ibuf, input_blocksize);
+ nread = safe_read (input_fd, ibuf, input_blocksize);
if (nread == 0)
break; /* EOF. */
char *stpcpy ();
char *xmalloc ();
void error ();
+int safe_read ();
+int full_write ();
int make_path ();
int isdir ();
return 1;
}
- while ((bytes = read (fromfd, buffer, READ_SIZE)) > 0)
- if (write (tofd, buffer, bytes) != bytes)
+ while ((bytes = safe_read (fromfd, buffer, READ_SIZE)) > 0)
+ if (full_write (tofd, buffer, bytes) < 0)
{
error (0, errno, "%s", to);
goto copy_error;
int isdir ();
int yesno ();
void error ();
+int safe_read ();
+int full_write ();
void strip_trailing_slashes ();
int eaccess_stat ();
char *stpcpy ();
return 1;
}
- while ((len = read (ifd, buf, sizeof (buf))) > 0)
+ while ((len = safe_read (ifd, buf, sizeof (buf))) > 0)
{
- int wrote = 0;
- char *bp = buf;
-
- do
+ if (full_write (ofd, buf, len) < 0)
{
- wrote = write (ofd, bp, len);
- if (wrote < 0)
- {
- error (0, errno, "%s", dest);
- close (ifd);
- close (ofd);
- unlink (dest);
- return 1;
- }
- bp += wrote;
- len -= wrote;
- } while (len > 0);
+ error (0, errno, "%s", dest);
+ close (ifd);
+ close (ofd);
+ unlink (dest);
+ return 1;
+ }
}
if (len < 0)
{
time_t get_date ();
time_t posixtime ();
void error ();
+int safe_read ();
+int full_write ();
void invalid_arg ();
static int touch ();
fd = open (file, O_RDWR, 0666);
if (fd < 0
- || read (fd, &c, sizeof (char)) < 0
+ || safe_read (fd, &c, sizeof (char)) < 0
|| lseek (fd, (off_t) 0, SEEK_SET) < 0
- || write (fd, &c, sizeof (char)) < 0
+ || full_write (fd, &c, sizeof (char)) < 0
|| ftruncate (fd, filesize) < 0
|| close (fd) < 0)
status = -1;