filemover_meta.c from EmStar at Krugle
Show filemover_meta.c syntax highlighted
#include <devel/dts/dts_shared.h>
char filemover_meta_c_cvsid[] = "$Id: filemover_meta.c,v 1.2 2006/04/20 02:05:38 mlukac Exp $";
int filemover_meta_check_meta(char *file)
{
if (strstr(file, ".dts") == NULL)
return 0;
int fd = open(file, O_RDONLY);
if (fd <= 0) {
elog(LOG_WARNING, "Error opening %s to check for metadata: %s", file, strerror(errno));
return 0;
}
filemover_meta_header_t fmht = {};
int res = read(fd, (char *) &fmht, sizeof(filemover_meta_header_t));
if (res < sizeof(filemover_meta_header_t)) {
elog(LOG_WARNING, "Error reading %i bytes from %s, only read %i: %s",
sizeof(filemover_meta_header_t), file, res, strerror(errno));
close(fd);
return 0;
}
close(fd);
if ((fmht.filemover_meta_version == FILEMOVER_META_VERSION1 ||
fmht.filemover_meta_version == FILEMOVER_META_VERSION2) &&
(strcmp(fmht.filemover_meta_version_string, FILEMOVER_META_VERSION1_STRING) == 0 ||
strcmp(fmht.filemover_meta_version_string, FILEMOVER_META_VERSION2_STRING) == 0)
) {
// elog(LOG_WARNING, "Found file with meta versoin %i: %s:",
// (fmht.filemover_meta_version == FILEMOVER_META_VERSION1) ? 1 : 2,
// file);
close(fd);
return 1;
}
close(fd);
return 0;
}
/* converts file to a .dts file in place */
int filemover_meta_initialize_meta(char *file)
{
unsigned char fileheader[FILEMOVER_META_VERSION1_SIZE] = {};
char newfile[strlen(file) + 5];
if (filemover_meta_check_meta(file)) {
elog(LOG_WARNING, "File already has meta data");
return 1;
}
struct stat s = {};
if (stat(file, &s) < 0) {
elog(LOG_WARNING, "Unable to stat %s pre meta: %s", file, strerror(errno));
return 1;
}
filemover_meta_header_t fmht = {
filemover_meta_version: FILEMOVER_META_VERSION1,
filemover_meta_size: FILEMOVER_META_VERSION1_SIZE,
filemover_num_elements: 0,
};
fmht.file_size = s.st_size;
strncpy(fmht.filemover_meta_version_string, FILEMOVER_META_VERSION1_STRING,
FILEMOVER_META_VERSION_STRING_SIZE);
elog(LOG_WARNING, "Can fit %i elements in header. subheader %i element %i",
(FILEMOVER_META_VERSION1_SIZE - sizeof(filemover_meta_header_t)) / sizeof(filemover_meta_entry_t),
sizeof(filemover_meta_header_t), sizeof(filemover_meta_entry_t));
memcpy(fileheader, &fmht, sizeof(fmht));
sprintf(newfile, "%s.dts", file);
int infile = open(file, O_RDONLY);
if (infile <= 0) {
elog(LOG_WARNING, "Error opening %s for meta: %s", file, strerror(errno));
return 1;
}
elog(LOG_WARNING, "1");
int outfile = open(newfile, O_RDWR | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
if (outfile <=0) {
elog(LOG_WARNING, "Error opening %s for meta: %s", newfile, strerror(errno));
close(infile);
unlink(newfile);
return 1;
}
elog(LOG_WARNING, "2");
if (write(outfile, fileheader, FILEMOVER_META_VERSION1_SIZE) < FILEMOVER_META_VERSION1_SIZE) {
elog(LOG_WARNING, "Error writing meta to file %s: %s", newfile, strerror(errno));
close(infile);
close(outfile);
unlink(newfile);
return 1;
}
char buf[4096] = {};
int res = 0;
while ((res = read(infile, buf, 4096)) > 0) {
if (write(outfile, buf, res) < 0) {
elog(LOG_WARNING, "Error writing meta to file %s: %s", newfile, strerror(errno));
close(infile);
close(outfile);
unlink(newfile);
return 1;
}
// elog(LOG_WARNING, "Write %i to file", res);
}
elog(LOG_WARNING, "4");
close(infile);
close(outfile);
if (unlink(file) < 0) {
elog(LOG_WARNING, "Error unlinking %s ", file);
return 1;
}
return 0;
}
int filemover_meta_update_meta(char *file, tcpxfer_done_stats_packet_t *stats)
{
if (filemover_meta_check_meta(file) == 0)
return 0;
/* read in header */
int fd = open(file, O_RDWR);
if (fd <= 0) {
elog(LOG_WARNING, "Error opening file for meta update: %s: %s",
file, strerror(errno));
return 0;
}
lseek(fd, 0, SEEK_SET); /* probbaly do notneed this */
/* read first part */
filemover_meta_header_t fmht = {};
int res = read(fd, (void *) &fmht, sizeof(filemover_meta_header_t));
if (res != sizeof(filemover_meta_header_t)) {
elog(LOG_WARNING, "couldn't read %i from %s, only read %i: %s",
sizeof(filemover_meta_header_t), file, res, strerror(errno));
close(fd);
return 0;
}
elog(LOG_WARNING, "Adding meta to file %s: version %s, header size %i",
file, fmht.filemover_meta_version_string, fmht.filemover_meta_size);
elog(LOG_WARNING, "File already has %i meta entries",
fmht.filemover_num_elements);
/* read in all the whole header into meta data */
int totalfit = (fmht.filemover_meta_size - sizeof(filemover_meta_header_t)) /
sizeof(filemover_meta_entry_t);
if (fmht.filemover_num_elements >= totalfit) {
elog(LOG_WARNING, "Meta data header is full: %i of %i", fmht.filemover_num_elements,
totalfit);
close(fd);
return 0;
}
elog(LOG_WARNING, "Meta data header: %i of %i used: %s",
fmht.filemover_num_elements, totalfit, file);
filemover_meta_entry_t fme[totalfit];
res = 0;
int totalread = 0;
int totalsize = sizeof(filemover_meta_entry_t) * totalfit;
while ((res = read(fd, ((void *) fme) + totalread , totalsize - totalread))
!= (totalsize - totalread)) {
totalread += res;
}
/* find the first empty slot */
for (res = 0; res < totalfit; ++res) {
if (fme[res].stats.to_node == 0 && fme[res].stats.from_node == 0) {
elog(LOG_WARNING, "Found empty meta slot at %i of %i: %s", res, totalfit, file);
break;
}
}
/* copy */
filemover_meta_entry_t f = {};
// memmove(&(fme[res].stats), stats, sizeof(tcpxfer_done_stats_packet_t));
memmove(&(f.stats), stats, sizeof(tcpxfer_done_stats_packet_t));
// elog(LOG_WARNING, "Bandwidth is %f should be %f", fme[res].stats.bandwidth, );
// memset(&(f.stats), 1, sizeof(tcpxfer_done_stats_packet_t));
/* update */
fmht.filemover_num_elements += 1;
// memset(&(fmht), 1, sizeof(filemover_meta_header_t));
/* rewrite */
if (lseek(fd, 0, SEEK_SET) != 0) {
elog(LOG_WARNING, "Unable to seek to begining, write meta failed %s: %s",
file, strerror(errno));
close(fd);
return 0;
}
if (write(fd, &fmht, sizeof(filemover_meta_header_t)) != sizeof(filemover_meta_header_t)) {
elog(LOG_CRIT, "Error writing metadata header! Possibly corrupt! %s: %s", file, strerror(errno));
close(fd);
return 0;
}
if (lseek(fd, sizeof(filemover_meta_header_t) + (sizeof(filemover_meta_entry_t) * res), SEEK_SET) !=
sizeof(filemover_meta_header_t) + (sizeof(filemover_meta_entry_t) * res)) {
elog(LOG_WARNING, "Unable to seek to correct spot in header! %s: %s", file, strerror(errno));
close(fd);
return 0;
}
if (write(fd, &f, sizeof(filemover_meta_entry_t)) != sizeof(filemover_meta_entry_t)) {
elog(LOG_CRIT, "Error writing metadata! Possibly corrupt! %s: %s", file, strerror(errno));
close(fd);
return 0;
}
close(fd);
return 1;
}
See more files for this project here