fs.c

00001 /*
00002  * Copyright (c) 2005-2012 by KoanLogic s.r.l. - All rights reserved.
00003  */
00004 
00005 #include <sys/types.h>
00006 #include <sys/stat.h>
00007 
00008 #include <string.h>
00009 #include <stdlib.h>
00010 #include <stdio.h>
00011 
00012 #include <u/libu_conf.h>
00013 #include <toolbox/fs.h>
00014 #include <toolbox/carpal.h>
00015 #include <toolbox/misc.h>
00016 
00035 int u_copy (const char *src, const char *dst)
00036 {
00037     FILE *sfp = NULL, *dfp = NULL;
00038     size_t c;
00039     char buf[4096];
00040 
00041     dbg_return_if (src == NULL, ~0);
00042     dbg_return_if (dst == NULL, ~0);
00043 
00044     sfp = fopen(src, "rb");
00045     dbg_err_sifm(sfp == NULL, "unable to open %s for reading", src);
00046 
00047     dfp = fopen(dst, "wb+");
00048     dbg_err_sifm(dfp == NULL, "unable to open %s for writing", dst);
00049 
00050     while((c = fread(buf, 1, sizeof(buf), sfp)) > 0)
00051     {
00052         dbg_err_sifm(fwrite(buf, 1, c, dfp) == 0, "error writing to %s", dst);
00053     }
00054 
00055     dbg_err_sif(fclose(sfp)); sfp = NULL;
00056 
00057     dbg_err_sifm(fclose(dfp), "error flushing %s", dst); dfp = NULL;
00058 
00059     return 0;
00060 err:
00061     if(sfp)
00062         fclose(sfp);
00063     if(dfp)
00064         fclose(dfp);
00065     return ~0;
00066 }
00067 
00079 int u_move(const char *src, const char *dst)
00080 {
00081     int rc;
00082 
00083     dbg_return_if (src == NULL, ~0);
00084     dbg_return_if (dst == NULL, ~0);
00085 
00086 #ifdef HAVE_LINK
00087     dbg_err_sif((rc = link(src, dst)) < 0 && errno != EXDEV);
00088 
00089     if(rc && errno == EXDEV)
00090         dbg_err_if(u_copy(src, dst)); /* deep copy */
00091 #else
00092     u_unused_args(rc);
00093 
00094     dbg_err_if(u_copy(src, dst));
00095 #endif
00096 
00097     dbg_if(u_remove(src) < 0);
00098 
00099     return 0;
00100 err:
00101     return ~0;
00102 }
00103 
00114 int u_remove(const char *file)
00115 {
00116     dbg_return_if (file == NULL, ~0);
00117 
00118     dbg_err_sif(unlink(file) < 0);
00119 
00120     return 0;
00121 err:
00122     return ~0;
00123 }
00124 

←Products
© 2005-2012 - KoanLogic S.r.l. - All rights reserved