Main Page | Modules | Data Structures | File List | Data Fields

fs.c

00001 /*
00002  * Copyright (c) 2005-2008 by KoanLogic s.r.l. - All rights reserved.
00003  */
00004 
00005 static const char rcsid[] =
00006     "$Id: fs.c,v 1.4 2008/03/10 16:51:44 tho Exp $";
00007 
00008 #include <sys/types.h>
00009 #include <sys/stat.h>
00010 
00011 #include <string.h>
00012 #include <stdlib.h>
00013 #include <stdio.h>
00014 
00015 #include <u/libu_conf.h>
00016 #include <toolbox/fs.h>
00017 #include <toolbox/carpal.h>
00018 #include <toolbox/misc.h>
00019 
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_err_if(src == NULL);
00042     dbg_err_if(dst == NULL);
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 
00078 int u_move(const char *src, const char *dst)
00079 {
00080     int rc;
00081 
00082     dbg_err_if(src == NULL);
00083     dbg_err_if(dst == NULL);
00084 
00085 #ifdef HAVE_LINK
00086     dbg_err_sif((rc = link(src, dst)) < 0 && errno != EXDEV);
00087 
00088     if(rc && errno == EXDEV)
00089         dbg_err_if(u_copy(src, dst)); /* deep copy */
00090 #else
00091     u_unused_args(rc);
00092 
00093     dbg_err_if(u_copy(src, dst));
00094 #endif
00095 
00096     dbg_if(u_remove(src) < 0);
00097 
00098     return 0;
00099 err:
00100     return ~0;
00101 }
00102 
00112 int u_remove(const char *file)
00113 {
00114     dbg_err_if(file == NULL);
00115 
00116     dbg_err_sif(unlink(file) < 0);
00117 
00118     return 0;
00119 err:
00120     return ~0;
00121 }
00122 

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