Category : Files from Magazines
Archive   : CUJ9202.ZIP
Filename : 1002111A

 
Output of file : 1002111A contained in archive : CUJ9202.ZIP

#include
#define SIZE_BUFFER 1024
#include
#include
#ifdef BSD
#include /* This header name varies */
#else
#include
#endif
static int copy_files();

truncate_file(path, length)
/* Truncates a file to the length specified */
char *path;
int length;
{
int input_file, temp_file;
char temp_file_name[L_tmpnam];
struct stat file_status;
int ret;

ret = 0;
if (length < 0)
{
ret = -10;
goto end;
}

/* If 0 length, then just open/close it */
if (length == 0)
{
input_file = open(path, O_WRONLY | O_TRUNC, 0666);
if (input_file < 0)
{
ret = -1;
goto end;
}
close (input_file);
goto end;
}

input_file = open(path, O_RDONLY, 0);
if (input_file < 0)
{
ret = -1;
goto end;
}

/* Check the file length - no sense copying if shorter
already */
fstat(input_file, &file_status);
if (length > file_status.st_size)
{
close (input_file);
ret = -3;
goto end;
}

/* Open a temporary file to hold the contents to be copied
back */
tmpnam(temp_file_name);
temp_file = open(temp_file_name, O_RDWR | O_CREAT, 0666);
if (temp_file < 0)
{
ret = -2;
goto end;
}

/* Make a copy of the file */
ret = copy_files(input_file, temp_file, length);
if (ret == 0)
{
lseek(temp_file,0L,0);
close(input_file);
input_file = open(path, O_WRONLY | O_TRUNC, 0666);
if (input_file < 0)
ret = -12;
else
{
ret = copy_files(temp_file, input_file, length);
close(input_file);
}
}

close (temp_file);
unlink(temp_file_name);

end:
return ret;
}


static int copy_files(file_in, file_out, length)
/* Copies from file in to file out */
int file_in;
int file_out;
int length;
{
int ret;
char buffer[SIZE_BUFFER];
int read_length;
int write_length;
int length_to_read;
int length_to_write;
ret = 0;
while (length > 0)
{
if (length > SIZE_BUFFER)
length_to_read = SIZE_BUFFER;
else
length_to_read = length;
length -= length_to_read;
read_length = read(file_in, buffer, length_to_read);
if (read_length != length_to_read)
{
ret = -4;
goto end;
}
length_to_write = read_length;
write_length = write(file_out, buffer,
length_to_write);
if (write_length != length_to_write)
{
ret = -5;
goto end;
}
}
end:
return ret;
}

main()
{
printf("\n Ret is %d", truncate_file("a:temp", 1));
}