diff --git a/src/dir_export.c b/src/dir_export.c index c73919750bea77f2aeef14a9ceec2e9dbfbe821c..eadccf77903b09e8c3b549a10bbd3eeb62e02898 100644 --- a/src/dir_export.c +++ b/src/dir_export.c @@ -75,6 +75,9 @@ static void output_int(uint64_t n) { static void output_info(struct dir *d, const char *name, struct dir_ext *e) { + if(!extended_info || !(d->flags & FF_EXT)) + e = NULL; + fputs("{\"name\":\"", stream); output_string(name); fputc('"', stream); @@ -96,6 +99,17 @@ static void output_info(struct dir *d, const char *name, struct dir_ext *e) { fputs(",\"ino\":", stream); output_int(d->ino); + if(e) { + fputs(",\"uid\":", stream); + output_int(e->uid); + fputs(",\"gid\":", stream); + output_int(e->gid); + fputs(",\"mode\":", stream); + output_int(e->mode); + fputs(",\"mtime\":", stream); + output_int(e->mtime); + } + /* TODO: Including the actual number of links would be nicer. */ if(d->flags & FF_HLNKC) fputs(",\"hlnkc\":true", stream); @@ -109,8 +123,6 @@ static void output_info(struct dir *d, const char *name, struct dir_ext *e) { else if(d->flags & FF_OTHFS) fputs(",\"excluded\":\"othfs\"", stream); - /* TODO: Output extended info if -e is given */ - fputc('}', stream); } @@ -136,7 +148,7 @@ static int item(struct dir *item, const char *name, struct dir_ext *ext) { /* File header. * TODO: Add scan options? */ if(!stack.top) { - fputs("[1,0,{\"progname\":\""PACKAGE"\",\"progver\":\""PACKAGE_VERSION"\",\"timestamp\":", stream); + fputs("[1,1,{\"progname\":\""PACKAGE"\",\"progver\":\""PACKAGE_VERSION"\",\"timestamp\":", stream); output_int((uint64_t)time(NULL)); fputc('}', stream); } diff --git a/src/dir_import.c b/src/dir_import.c index 53b31f67286d80ff3c3e1e3d689f9b82ccec7015..31e9613b7a75bd049459a8c116237da7714fb41e 100644 --- a/src/dir_import.c +++ b/src/dir_import.c @@ -448,6 +448,22 @@ static int iteminfo() { } else if(strcmp(ctx->val, "ino") == 0) { /* ino */ C(rint64(&iv, UINT64_MAX)); ctx->buf_dir->ino = iv; + } else if(strcmp(ctx->val, "uid") == 0) { /* uid */ + C(rint64(&iv, INT32_MAX)); + ctx->buf_dir->flags |= FF_EXT; + ctx->buf_ext->uid = iv; + } else if(strcmp(ctx->val, "gid") == 0) { /* gid */ + C(rint64(&iv, INT32_MAX)); + ctx->buf_dir->flags |= FF_EXT; + ctx->buf_ext->gid = iv; + } else if(strcmp(ctx->val, "mode") == 0) { /* mode */ + C(rint64(&iv, UINT16_MAX)); + ctx->buf_dir->flags |= FF_EXT; + ctx->buf_ext->mode = iv; + } else if(strcmp(ctx->val, "mtime") == 0) { /* mtime */ + C(rint64(&iv, UINT64_MAX)); + ctx->buf_dir->flags |= FF_EXT; + ctx->buf_ext->mtime = iv; } else if(strcmp(ctx->val, "hlnkc") == 0) { /* hlnkc */ if(*ctx->buf == 't') { C(rlit("true", 4)); diff --git a/src/dir_scan.c b/src/dir_scan.c index b0f0b1ddbeecfc6c852852147993f9c8a619052a..4b7b1743a38de07afbefb3a2f98f5c080f6be850 100644 --- a/src/dir_scan.c +++ b/src/dir_scan.c @@ -75,7 +75,7 @@ static void stat_to_dir(struct stat *fs) { } buf_ext->mode = fs->st_mode; - buf_ext->mtime = fs->st_mtim; + buf_ext->mtime = fs->st_mtime; buf_ext->uid = (int)fs->st_uid; buf_ext->gid = (int)fs->st_gid; } diff --git a/src/global.h b/src/global.h index b998ef4d6592386fb8aa8fe821c14326f958bc4b..92b6eb71d70bf4be64fcfc999eb030b68312adf9 100644 --- a/src/global.h +++ b/src/global.h @@ -85,7 +85,7 @@ struct dir { * memory region as struct dir, placed after the name field. See util.h for * macros to help manage this. */ struct dir_ext { - struct timespec mtime; + uint64_t mtime; int uid, gid; unsigned short mode; };