diff --git a/src/evmctl.c b/src/evmctl.c index dcd051f..1a94d58 100644 --- a/src/evmctl.c +++ b/src/evmctl.c @@ -730,8 +730,8 @@ static int get_uuid(struct stat *st, char *uuid) static int calc_evm_hash(const char *file, unsigned char *hash) { struct stat st; - int fd, err; - uint32_t generation; + int err; + uint32_t generation = 0; EVP_MD_CTX ctx; unsigned int mdlen; char **xattrname; @@ -740,24 +740,26 @@ static int calc_evm_hash(const char *file, unsigned char *hash) ssize_t list_size; char uuid[16]; - fd = open(file, 0); - if (fd < 0) { - log_err("Unable to open %s\n", file); + if (lstat(file, &st)) { + log_err("lstat() failed\n"); return -1; } - if (fstat(fd, &st)) { - log_err("fstat() failed\n"); - return -1; + if (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode)) { + /* we cannot at the momement to get generation of special files.. + * kernel API does not support it */ + int fd = open(file, 0); + if (fd < 0) { + log_err("Unable to open %s\n", file); + return -1; + } + if (ioctl(fd, EXT34_IOC_GETVERSION, &generation)) { + log_err("ioctl() failed\n"); + return -1; + } + close(fd); } - if (ioctl(fd, EXT34_IOC_GETVERSION, &generation)) { - log_err("ioctl() failed\n"); - return -1; - } - - close(fd); - log_info("generation: %u\n", generation); list_size = llistxattr(file, list, sizeof(list));