diff options
| author | M.Shulhan <ms@kilabit.org> | 2009-04-05 17:52:57 +0700 |
|---|---|---|
| committer | M.Shulhan <ms@kilabit.org> | 2009-04-05 17:52:57 +0700 |
| commit | 19c3ee85ea45c5b5c2a479af17b86ba65d52673b (patch) | |
| tree | 2bf8fe1e94691e85d2c19adea8a42240586c5862 /op/vos_File.c | |
| parent | 459cd2d7715baea5a56090b3331f0b9b95e832c2 (diff) | |
| download | vos-19c3ee85ea45c5b5c2a479af17b86ba65d52673b.tar.xz | |
fix sort process.
type/vos_TStmtJoin:
- deleted, merge into vos_TStmtMeta.h
op/vos_File:
- file_open: fix memory leak on open fail.
- file_raw_copy: new, function to copy file.
- file_raw_get_dirname: new, function to get directory name from path.
op/vos_Stmt:
- stmt_find_by_name: re-structure the switch.
- stmt_update_meta: new, update meta filename to the last output name.
op/vos_StmtSort:
- stmtsort_create: remove free sort->in.
- stmtsort_init_output: split into stmtsort_init.
- stmtsort_init: new.
- stmtsort_destroy: remove unused temporary sort file.
proc/vos_create:
- vos_process_create: update meta object before processing.
proc/vos_join:
- change affect by split of stmtsort_init_output.
proc/vos_parser:
- use 'filename' as an alias if alias is not set in statement.
proc/vos_sort:
- vos_process_sort: fix bug in sort process.
when input file is splitted into several thread and the first split
is precisely end in a new-line character, this can cause losing of one
row in the output file.
- sort_write: use 'get_tmp_dir()' to get temporary directory.
proc/vos_sort_merge:
- vos_sort_merge: simplified the merge process if only one file to be merged.
- single_merge: new.
vos:
- get_tmp_dir: new, function to get temporary directory.
Diffstat (limited to 'op/vos_File.c')
| -rw-r--r-- | op/vos_File.c | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/op/vos_File.c b/op/vos_File.c index dfb80cb..f6ccd07 100644 --- a/op/vos_File.c +++ b/op/vos_File.c @@ -32,6 +32,8 @@ int file_open(struct File **F, const char *f, int flag) if ((*F)->d < 0) { str_raw_copy(f, &_vos.e_sparm0); + free((*F)); + (*F) = 0; switch (errno) { case ENOENT: @@ -249,3 +251,129 @@ int file_raw_is_exist(const char *file) return s; } + +/** + * @desc: copy file 'from' to 'to'. + */ +int file_raw_copy(const char *from, const char *to) +{ + int s; + int fdin; + int fdout; + long int nread = 0; + long int nwrite = 0; + long int ntot = 0; + char *buf; + + fdin = open(from, O_RDONLY); + if (fdin < 0) + return E_FILE_OPEN; + + fdout = open(to, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); + if (fdout < 0) { + close(fdin); + return E_FILE_OPEN; + } + + buf = (char *) calloc(_vos.file_buf_size, sizeof(char)); + if (! buf) { + close(fdin); + close(fdout); + return E_MEM; + } + + nread = read(fdin, buf, _vos.file_buf_size); + if (nread < 0) { + s = E_FILE_READ; + goto err; + } + while (nread > 0) { + do { + nwrite = write(fdout, &buf[ntot], nread); + if (nwrite < 0) { + s = E_FILE_WRITE; + goto err; + } + ntot += nwrite; + nread -= nwrite; + } while (nread > 0); + + nwrite = 0; + ntot = 0; + + nread = read(fdin, buf, _vos.file_buf_size); + if (nread < 0) { + s = E_FILE_READ; + goto err; + } + } + + s = 0; +err: + close(fdout); + close(fdin); + free(buf); + return s; +} + +/** + * @desc: get directory name from path. + * path => dirname + * "/usr/lib" => "/usr" + * "/usr/" => "/" + * "usr" => "." + * "/" => "/" + * "." => "." + * ".." => ".." + * + * @return: + * < 0 : success. + * < E_MEM : fail. + */ +int file_raw_get_dirname(const char *path, char **dirname) +{ + int l = 0; + char *d = 0; + + if (! path + || (path && strcmp(path, "..") == 0)) { + d = (char *) calloc(2, sizeof(char)); + if (d) + d[0] = '.'; + goto out; + } + + l = strlen(path) - 1; + + /* path : '/' */ + if (l == 0 && path[0] == '/') { + d = (char *) calloc(2, sizeof(char)); + if (d) + d[0] = '/'; + goto out; + } + + /* path : '/path///' */ + while (l >= 0 && path[l] == '/') + l--; + + while (l >= 0 && path[l] != '/') + l--; + + if (l < 0) { + d = (char *) calloc(2, sizeof(char)); + if (d) + d[0] = '.'; + } else { + if (l == 0) + l++; + d = (char *) calloc(l + 1, sizeof(char)); + if (d) + memcpy(d, path, l); + } + +out: + (*dirname) = d; + + return d ? 0 : E_MEM; +} |
