diff options
Diffstat (limited to 'src/file.cc')
-rw-r--r-- | src/file.cc | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/src/file.cc b/src/file.cc new file mode 100644 index 0000000..ce06d67 --- /dev/null +++ b/src/file.cc @@ -0,0 +1,175 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/*************************************************************************** + * file.cc + * + * Thu Jun 9 15:31:38 CEST 2005 + * Copyright 2005 Bent Bisballe + * deva@aasimon.org + ****************************************************************************/ + +/* + * This file is part of MIaV. + * + * MIaV 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 2 of the License, or + * (at your option) any later version. + * + * MIaV 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 MIaV; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + */ + +/* + * $Id$ + */ + +/* + * $Log$ + * Revision 1.1 2005/06/09 17:54:00 deva + * New file object, that takes care of uniqueness and counts up number in + * filename, when grown too big. + * + */ + +#include <config.h> +#include "file.h" + +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <string.h> +#include <unistd.h> + +#include <stdio.h> + +#include <stdlib.h> + + +File::File(char *fn, char* ext) +{ + char path[256]; + + filename = (char*)malloc(strlen(fn) + 1); + extension = (char*)malloc(strlen(ext) + 1); + + strcpy(filename, fn); + strcpy(extension, ext); + + num = 0; + fd = -1; + + int pos = (int)strrchr(filename, '/'); + memset(path, 0, sizeof(path)); + + if(pos) { // pos is NULL, a file will be created in the current dir (Which is bad) + pos -= (int)filename; // Make pos relative to the beginning of the string + strncpy(path, filename, pos); + createPath(path); + } + + Open(); +} + +File::~File() +{ + close(fd); + + free(filename); + free(extension); +} + +int File::Open() +{ + char fname[256]; + + if(fd) close(fd); + fd = -1; + + while(fd == -1) { + sprintf(fname, "%s%.3d.%s", filename, num, extension); + fd = open(fname, O_CREAT | O_WRONLY | O_SYNC | O_EXCL, //| O_LARGEFILE + S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + num ++; + + // If more than 1000 files are created in one day, something is terribly wrong! + if(num > 1000) { + fprintf(stderr, "Something is wrong with tha path [%s]!\n", fname); + exit(1); + } + + } + return 0; +} + +int File::Write(void* data, int size) +{ + int w; + + w = write(fd, data, size); + + if(w != size) { + Open(); + w = write(fd, data, size); + if(w != size) { + fprintf(stderr, "Out of diskspace!\n"); + exit(1); + } + } + + return w; +} + +int File::createPath(char* path) +{ + // struct stat stats; + char *subpath; + + subpath = (char*)calloc(strlen(path) + 1, 1); + + strcpy(subpath, path); + + subpath[strrchr(subpath, '/') - subpath] = '\0'; + + printf("%s\n", path); + + if(strlen(subpath) > 0) createPath(subpath); + + // stat(path, &stats); + //if(!S_ISDIR(stats.st_mode) && S_ISREG(stats.st_mode)) + mkdir(path, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH | S_IROTH); + + free(subpath); + + return 0; +} + + +#ifdef FILE_TEST // Test +#define BLOCK_SIZE 1024*1024 +#define TIMES 4000 +int main() +{ + void *buf = malloc(BLOCK_SIZE); + + double b = BLOCK_SIZE; + double t = TIMES; + + double gb = b / (1024 * 1024 * 1024); + gb *= t; + + printf("Writing %f GB.\n", gb); + + File file("/tmp/filetest/folder1/folder2/file", "ext"); + for(int cnt = 0; cnt < TIMES; cnt++) { + file.Write(buf, BLOCK_SIZE); + } + + printf("Done.\n"); +} +#endif // Test |