From 21c056f51d7323de11c0a6abe94129ed64bc6891 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Mon, 27 Aug 2012 21:10:07 +0200 Subject: [PATCH] Use uint64_t instead of dev_t as well + added comment explaining this --- src/dir_scan.c | 8 ++++---- src/global.h | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/dir_scan.c b/src/dir_scan.c index 4b07ed5..a0efcb3 100644 --- a/src/dir_scan.c +++ b/src/dir_scan.c @@ -43,14 +43,14 @@ int dir_scan_smfs; /* Stay on the same filesystem */ -static dev_t curdev; /* current device we're scanning on */ +static uint64_t curdev; /* current device we're scanning on */ /* Populates the struct dir item with information from the stat struct. Sets * everything necessary for output_dir.item() except FF_ERR and FF_EXL. */ static void stat_to_dir(struct dir *d, struct stat *fs) { d->ino = (uint64_t)fs->st_ino; - d->dev = fs->st_dev; + d->dev = (uint64_t)fs->st_dev; if(S_ISREG(fs->st_mode)) d->flags |= FF_FILE; @@ -60,7 +60,7 @@ static void stat_to_dir(struct dir *d, struct stat *fs) { if(!S_ISDIR(fs->st_mode) && fs->st_nlink > 1) d->flags |= FF_HLNKC; - if(dir_scan_smfs && curdev != fs->st_dev) + if(dir_scan_smfs && curdev != d->dev) d->flags |= FF_OTHFS; if(!(d->flags & (FF_OTHFS|FF_EXL))) { @@ -254,7 +254,7 @@ int dir_scan_process() { } if(!dir_fatalerr) { - curdev = fs.st_dev; + curdev = (uint64_t)fs.st_dev; d = dir_createstruct(dir_curpath); if(fail) d->flags |= FF_ERR; diff --git a/src/global.h b/src/global.h index 7737204..edebb83 100644 --- a/src/global.h +++ b/src/global.h @@ -55,25 +55,27 @@ #define ST_HELP 3 -/* structure representing a file or directory - * XXX: probably a good idea to get rid of the custom _t types and use - * fixed-size integers instead, which are much more predictable */ +/* structure representing a file or directory */ struct dir { struct dir *parent, *next, *prev, *sub, *hlnk; int64_t size, asize; - uint64_t ino; + uint64_t ino, dev; int items; - dev_t dev; unsigned char flags; char name[3]; /* must be large enough to hold ".." */ }; /* sizeof(total dir) = SDIRSIZE + strlen(name) = sizeof(struct dir) - 3 + strlen(name) + 1 */ #define SDIRSIZE (sizeof(struct dir)-2) -/* Ideally, the name array should be as large as the padding added to the end of - * the struct, but I can't figure out a portable way to calculate this. We can - * be sure that it's at least 3 bytes, though, as the struct is aligned to at - * least 4 bytes and the flags field is a single byte. */ +/* A note on the ino and dev fields above: ino is usually represented as ino_t, + * which POSIX specifies to be an unsigned integer. dev is usually represented + * as dev_t, which may be either a signed or unsigned integer, and in practice + * both are used. dev represents an index / identifier of a device or + * filesystem, and I'm unsure whether a negative value has any meaning in that + * context. Hence my choice of using an unsigned integer. Negative values, if + * we encounter them, will just get typecasted into a positive value. No + * information is lost in this conversion, and the semantics remain the same. + */ /* program state */