aboutsummaryrefslogtreecommitdiff
path: root/op/vos_File.c
diff options
context:
space:
mode:
authorM.Shulhan <ms@kilabit.org>2009-04-05 17:52:57 +0700
committerM.Shulhan <ms@kilabit.org>2009-04-05 17:52:57 +0700
commit19c3ee85ea45c5b5c2a479af17b86ba65d52673b (patch)
tree2bf8fe1e94691e85d2c19adea8a42240586c5862 /op/vos_File.c
parent459cd2d7715baea5a56090b3331f0b9b95e832c2 (diff)
downloadvos-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.c128
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;
+}