#include "cupsd.h"
#ifdef HAVE_REMOVEFILE
# include <removefile.h>
#else
static int overwrite_data(int fd, const char *buffer, int bufsize,
int filesize);
#endif
int
cupsdRemoveFile(const char *filename)
{
#ifdef HAVE_REMOVEFILE
int ret;
removefile_state_t s;
s = removefile_state_alloc();
ret = removefile(filename, s, REMOVEFILE_SECURE_7_PASS);
removefile_state_free(s);
return (ret);
#else
int fd;
struct stat info;
char buffer[512];
int i;
if ((fd = open(filename, O_WRONLY | O_EXCL)) < 0)
return (-1);
unlink(filename);
if (fstat(fd, &info))
{
close(fd);
return (-1);
}
memset(buffer, 0xF6, sizeof(buffer));
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
memset(buffer, 0x00, sizeof(buffer));
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
memset(buffer, 0xFF, sizeof(buffer));
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
for (i = 0; i < sizeof(buffer); i ++)
buffer[i] = rand();
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
memset(buffer, 0x00, sizeof(buffer));
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
memset(buffer, 0xFF, sizeof(buffer));
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
for (i = 0; i < sizeof(buffer); i ++)
buffer[i] = rand();
if (overwrite_data(fd, buffer, sizeof(buffer), (int)info.st_size))
{
close(fd);
return (-1);
}
close(fd);
return (0);
#endif
}
#ifndef HAVE_REMOVEFILE
static int
overwrite_data(int fd,
const char *buffer,
int bufsize,
int filesize)
{
int bytes;
if (lseek(fd, 0, SEEK_SET) < 0)
return (-1);
while (filesize > 0)
{
if (filesize > bufsize)
bytes = bufsize;
else
bytes = filesize;
if ((bytes = write(fd, buffer, bytes)) < 0)
return (-1);
filesize -= bytes;
}
return (fsync(fd));
}
#endif
#ifdef TEST
# define testmain main
int
testmain(void)
{
FILE *fp;
fp = fopen("testfile.secure", "w");
fputs("Hello, World!\n", fp);
fputs("Now is the time for all good men to come to the aid of their "
"country.\n", fp);
fclose(fp);
if (cupsdRemoveFile("testfile.secure"))
{
printf("cupsdRemoveFile: FAIL (%s)\n", strerror(errno));
return (1);
}
else
{
puts("cupsdRemoveFile: PASS");
return (0);
}
}
#endif