build again - io put in some as yet "in thought" code

This commit is contained in:
Carsten Haitzler 2024-04-01 22:08:46 +01:00
parent 72fea7759a
commit 2410abae9d
2 changed files with 105 additions and 50 deletions

View File

@ -37,7 +37,8 @@ executable('thumb', [
executable('mv', [
'../../shared/sha.c',
'mv.c',
'meta.c'
'meta.c',
'status.c'
],
include_directories: inc,
dependencies: deps,

View File

@ -13,17 +13,114 @@
#include "cmd.h"
#include "eina_strbuf.h"
#include "eina_types.h"
#include "sha.h"
#include "meta.h"
#include "status.h"
static const char *config_dir = NULL;
static Eina_Bool
fs_mv(const char *src, const char *dst, Eina_Bool report_err)
{
// void status_begin(void);
// void status_end(void);
// void status_count(unsigned long long num_inc, const char *str);
// void status_pos(unsigned long long pos_inc, const char *str));
// void status_error(const char *path, const char *str);
Eina_Bool res = EINA_TRUE;
int ret;
// XXX: write out status file and update it
// XXX: ecore_file_mv() ? <- look at it
// XXX: utime()/utimes() -> utimensat()
status_count(1, src);
ret = rename(src, dst);
if (ret == 0) return res;
else
{
switch (errno)
{
case EACCES:
case EPERM: // permission denied
if (report_err) status_error(src, dst, "Move - Permission denied");
res = EINA_FALSE;
break;
case EBUSY: // file or dir is busy
if (report_err) status_error(src, dst, "Move - File busy");
res = EINA_FALSE;
break;
case EDQUOT: // no quota left
if (report_err) status_error(src, dst, "Move - Over quota");
res = EINA_FALSE;
break;
case EFAULT: // should not happen - but src or dst outside addr space
if (report_err) status_error(src, dst, "Move - Address fault");
res = EINA_FALSE;
break;
case EINVAL: // moving into a sub path of itself - invalid
if (report_err) status_error(src, dst, "Move on top of itself");
res = EINA_FALSE;
break;
case EISDIR: // moving file/dir into itself
if (report_err) status_error(src, dst, "Move - Destination is dir");
res = EINA_FALSE;
break;
case ELOOP: // too many symlinks in a loop
if (report_err) status_error(src, dst, "Move - Too many symlinks");
res = EINA_FALSE;
break;
case EMLINK: // max links exceeded
if (report_err) status_error(src, dst, "Move - Too many source links");
res = EINA_FALSE;
break;
case ENAMETOOLONG: // path too long (src or dst)
if (report_err) status_error(src, dst, "Move - Path too long");
res = EINA_FALSE;
break;
case ENOENT: // src or dst doesn't exist
if (report_err) status_error(src, dst, "Move - File does not exist");
res = EINA_FALSE;
break;
case ENOMEM: // out of mem
if (report_err) status_error(src, dst, "Move - Out of memory");
res = EINA_FALSE;
break;
case ENOSPC: // out of space on disk
if (report_err) status_error(src, dst, "Move - Disk full");
res = EINA_FALSE;
break;
case ENOTDIR: // moving dir on top of file
if (report_err) status_error(src, dst, "Move - On top of itself");
res = EINA_FALSE;
break;
case ENOTEMPTY:
case EEXIST: // dst is not an empty dir
if (report_err) status_error(src, dst, "Move - Destination not empty");
res = EINA_FALSE;
break;
case EROFS: // read only disk
if (report_err) status_error(src, dst, "Move - Read only filesystem");
res = EINA_FALSE;
break;
case EXDEV: // revert to cp + rm
// XXX: handle fallback to cp + rm
break;
default: // WAT???
res = EINA_FALSE;
break;
}
}
status_pos(1, src);
return res;
}
int
main(int argc, char **argv)
{
// mv [src] [dst]
// mv [src] [dst] if (report_error) status_error(src, dst, "Move - Too
// many symlinks");
const char *src, *dst, *fname, *home_dir;
Eina_Strbuf *buf = NULL;
@ -83,51 +180,8 @@ main(int argc, char **argv)
eina_strbuf_append(buf, dst);
eina_strbuf_append(buf, "/");
eina_strbuf_append(buf, fname);
// XXX: write out status file and update it
// XXX: ecore_file_mv() ? <- look at it
if (rename(src, eina_strbuf_string_get(buf)) == -1)
{
fprintf(stderr, "MV: %s\n", strerror(errno));
switch (errno)
{
case EACCES:
case EPERM: // permission denied
break;
case EBUSY: // file or dir is busy
break;
case EDQUOT: // no quota left
break;
case EFAULT: // should not happen - but src or dst outside addr space
break;
case EINVAL: // moving into a sub path of itsefl - invalid
break;
case EISDIR: // moving file on top of dir
break;
case ELOOP: // too many symlinks in a loop
break;
case EMLINK: // max links exceeded
break;
case ENAMETOOLONG: // path too long (src or dst)
break;
case ENOENT: // src or dst doesn't exist
break;
case ENOMEM: // out of mem
break;
case ENOSPC: // out of space on disk
break;
case ENOTDIR: // moving dir on top of file
break;
case ENOTEMPTY:
case EEXIST: // dst is not an empty dir
break;
case EROFS: // read only disk
break;
case EXDEV: // revert t640k
default: // WAT???
break;
}
}
else
status_begin();
if (fs_mv(src, eina_strbuf_string_get(buf), EINA_TRUE))
{
Eina_Bool src_can_write, dst_can_write;
const char *dstfile;
@ -147,7 +201,7 @@ main(int argc, char **argv)
if ((src_meta) && (dst_meta) && (meta_path_prepare(dstfile)))
{
// XXX: use mv() rename wrapper than will cp
rename(src_meta, dst_meta);
fs_mv(src_meta, dst_meta, EINA_FALSE);
}
free(src_meta);
free(dst_meta);
@ -158,14 +212,14 @@ main(int argc, char **argv)
if ((src_meta) && (dst_meta) && (meta_path_prepare(dstfile)))
{
// XXX: use mv() rename wrapper than will cp
rename(src_meta, dst_meta);
fs_mv(src_meta, dst_meta, EINA_FALSE);
}
free(src_meta);
free(dst_meta);
}
err:
if (buf) eina_strbuf_free(buf);
// XXX: delete status file
status_end();
meta_shutdown();