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