#include <Kerberos/KerberosDebug.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include "UNIXReadWrite.h"
int main (int argc, const char **argv)
{
int err = 0;
char *newFileName = NULL;
char *oldFileName = NULL;
pid_t pid = getpid ();
dprintf ("starting up...");
if (!err) {
err = WriteBuffer (STDOUT_FILENO, (char *) &pid, sizeof (pid));
dprintf ("Wrote pid %d (err = %d)", pid, err);
}
if (!err) {
if (argc != 2) { err = EINVAL; }
}
if (!err) {
newFileName = (char *) malloc (strlen (argv[1]) + 5 );
if (newFileName) {
sprintf (newFileName, "%s.new", argv[1]);
dprintf ("newFileName is %s", newFileName);
} else {
err = ENOMEM;
}
}
if (!err) {
oldFileName = (char *) malloc (strlen (argv[1]) + 5 );
if (oldFileName) {
sprintf (oldFileName, "%s.old", argv[1]);
dprintf ("oldFileName is %s", oldFileName);
} else {
err = ENOMEM;
}
}
if (!err) {
int newFD = -1;
char *fileData = NULL;
size_t fileLength = 0;
if (!err) {
dprintf ("opened new file");
err = ReadDynamicLengthBuffer (STDIN_FILENO, &fileData, &fileLength);
dprintf ("read new file of length %ld (err = %d)", fileLength, err);
}
if (!err) {
newFD = open (newFileName, (O_WRONLY | O_CREAT | O_TRUNC),
(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
if (newFD < 0) { err = errno; }
}
if (!err) {
err = WriteBuffer (newFD, fileData, fileLength);
dprintf ("wrote data to file (err = %d)", err);
}
if (newFD >= 0 ) { close (newFD); }
if (fileData) { free (fileData); }
}
if (!err) {
unlink (oldFileName);
dprintf ("copying new file into place");
err = link (argv[1], oldFileName);
if (!err || errno == ENOENT) {
err = rename (newFileName, argv[1]);
if (err) { err = errno; }
} else {
err = rename (argv[1], oldFileName);
if (err) { err = errno; }
if (!err) {
err = rename (newFileName, argv[1]);
if (err) {
err = errno;
rename (oldFileName, argv[1]); }
}
}
}
if (newFileName) { unlink (newFileName); free (newFileName); }
if (oldFileName) { free (oldFileName); }
dprintf ("done (err = %d)", err);
return err;
}