/* split.c -- split a file into pieces.
- Copyright (C) 88, 91, 1995-2005 Free Software Foundation, Inc.
+ Copyright (C) 1988, 1991, 1995-2006 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
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 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
\f
/* By tege@sics.se, with rms.
#include <sys/types.h>
#include "system.h"
-#include "dirname.h"
#include "error.h"
+#include "fd-reopen.h"
+#include "fcntl--.h"
#include "getpagesize.h"
#include "full-read.h"
#include "full-write.h"
#include "inttostr.h"
#include "quote.h"
#include "safe-read.h"
-#include "unistd-safer.h"
#include "xstrtol.h"
/* The official name of this program (e.g., no `g' prefix). */
/* Name of input file. May be "-". */
static char *infile;
-/* Descriptor on which input file is open. */
-static int input_desc;
-
/* Descriptor on which output file is open. */
static int output_desc;
{
char *dir = dir_name (outfile);
long name_max = pathconf (dir, _PC_NAME_MAX);
- if (0 <= name_max && name_max < base_len (base_name (outfile)))
+ if (0 <= name_max && name_max < base_len (last_component (outfile)))
error (EXIT_FAILURE, ENAMETOOLONG, "%s", outfile);
free (dir);
}
next_file_name ();
if (verbose)
- fprintf (stderr, _("creating file `%s'\n"), outfile);
- output_desc = fd_safer (open (outfile,
- O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
- (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
- | S_IROTH | S_IWOTH)));
+ fprintf (stderr, _("creating file %s\n"), quote (outfile));
+ output_desc = open (outfile,
+ O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
+ (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP
+ | S_IROTH | S_IWOTH));
if (output_desc < 0)
error (EXIT_FAILURE, errno, "%s", outfile);
}
do
{
- n_read = full_read (input_desc, buf, bufsize);
+ n_read = full_read (STDIN_FILENO, buf, bufsize);
if (n_read == SAFE_READ_ERROR)
error (EXIT_FAILURE, errno, "%s", infile);
bp_out = buf;
do
{
- n_read = full_read (input_desc, buf, bufsize);
+ n_read = full_read (STDIN_FILENO, buf, bufsize);
if (n_read == SAFE_READ_ERROR)
error (EXIT_FAILURE, errno, "%s", infile);
bp = bp_out = buf;
{
/* Fill up the full buffer size from the input file. */
- n_read = full_read (input_desc, buf + n_buffered, n_bytes - n_buffered);
+ n_read = full_read (STDIN_FILENO, buf + n_buffered, n_bytes - n_buffered);
if (n_read == SAFE_READ_ERROR)
error (EXIT_FAILURE, errno, "%s", infile);
if (digits_optind != 0 && digits_optind != this_optind)
n_units = 0; /* More than one number given; ignore other. */
digits_optind = this_optind;
- if (!DECIMAL_DIGIT_ACCUMULATE (n_units, c - '0', UINTMAX_MAX))
+ if (!DECIMAL_DIGIT_ACCUMULATE (n_units, c - '0', uintmax_t))
{
char buffer[INT_BUFSIZE_BOUND (uintmax_t)];
error (EXIT_FAILURE, 0,
}
/* Open the input file. */
- if (STREQ (infile, "-"))
- input_desc = STDIN_FILENO;
- else
- {
- input_desc = open (infile, O_RDONLY);
- if (input_desc < 0)
- error (EXIT_FAILURE, errno, "%s", infile);
- }
+ if (! STREQ (infile, "-")
+ && fd_reopen (STDIN_FILENO, infile, O_RDONLY, 0) < 0)
+ error (EXIT_FAILURE, errno, _("cannot open %s for reading"),
+ quote (infile));
+
/* Binary I/O is safer when bytecounts are used. */
- SET_BINARY (input_desc);
+ if (O_BINARY && ! isatty (STDIN_FILENO))
+ freopen (NULL, "rb", stdin);
/* No output file is open now. */
output_desc = -1;
/* Get the optimal block size of input device and make a buffer. */
- if (fstat (input_desc, &stat_buf) < 0)
+ if (fstat (STDIN_FILENO, &stat_buf) != 0)
error (EXIT_FAILURE, errno, "%s", infile);
in_blk_size = ST_BLKSIZE (stat_buf);
abort ();
}
- if (close (input_desc) < 0)
+ if (close (STDIN_FILENO) != 0)
error (EXIT_FAILURE, errno, "%s", infile);
if (output_desc >= 0 && close (output_desc) < 0)
error (EXIT_FAILURE, errno, "%s", outfile);