//
// aegis - project change supervisor
// Copyright (C) 2001-2006, 2008 Peter Miller
//
// 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 Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see
// .
//
#include
#include
#include
#include
#include
#include
#include
//
// NAME
// catfile - copy a file
//
// SYNOPSIS
// int catfile(char *path);
//
// DESCRIPTION
// The catfile function is used to print the contents of
// a file on the standard output.
//
// ARGUMENTS
// path - pathname of source file
//
// RETURNS
// 0 on success
// -1 on error, setting errno appropriately
//
int
catfile(const char *path)
{
int fd;
char *buffer;
long max;
long nbytes;
long nbytes2;
int err;
int result;
trace(("catfile(\"%s\")\n{\n", path));
os_interrupt_cope();
result = -1;
fd = open(path, O_RDONLY, 0666);
if (fd < 0)
goto done;
max = 1L << 13;
errno = 0;
buffer = (char *)malloc(max);
if (!buffer)
{
err = errno ? errno : ENOMEM;
close(fd);
errno = err;
goto done;
}
for (;;)
{
nbytes = read(fd, buffer, max);
if (nbytes < 0)
{
err = errno;
close(fd);
free(buffer);
errno = err;
goto done;
}
if (nbytes == 0)
break;
nbytes2 = write(fileno(stdout), buffer, nbytes);
if (nbytes2 < 0)
{
err = errno;
close(fd);
free(buffer);
errno = err;
goto done;
}
if (nbytes2 != nbytes)
{
close(fd);
free(buffer);
errno = EIO; // weird device, probably
goto done;
}
}
free(buffer);
result = close(fd);
//
// here for all exits
//
done:
trace(("return %d; /* errno = %d */\n", result, errno));
trace(("}\n"));
return result;
}