00001
00002
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));
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