diff options
author | Dmitri Pal <dpal@redhat.com> | 2010-03-31 19:21:35 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2010-04-14 12:15:54 -0400 |
commit | 539881bc12a01e4307cd474a584c2e30c1c09d9c (patch) | |
tree | a7e29428f186ee3ebf2bcf7d154ae6fa996010f3 /common/ini/ini_metadata.c | |
parent | e4956873b0ca4ec732e009f88be43549506f7819 (diff) | |
download | sssd-539881bc12a01e4307cd474a584c2e30c1c09d9c.tar.gz sssd-539881bc12a01e4307cd474a584c2e30c1c09d9c.tar.bz2 sssd-539881bc12a01e4307cd474a584c2e30c1c09d9c.zip |
Adding content to the metadata
This patch implements function that collects
stats and saves them in the ACCESS section
inside metadata.
Diffstat (limited to 'common/ini/ini_metadata.c')
-rw-r--r-- | common/ini/ini_metadata.c | 127 |
1 files changed, 126 insertions, 1 deletions
diff --git a/common/ini/ini_metadata.c b/common/ini/ini_metadata.c index 630de699..a5d5109f 100644 --- a/common/ini/ini_metadata.c +++ b/common/ini/ini_metadata.c @@ -20,6 +20,10 @@ */ #define _GNU_SOURCE +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <errno.h> #include "config.h" #include "collection.h" #include "collection_tools.h" @@ -85,11 +89,132 @@ int prepare_metadata(uint32_t metaflags, /* Collect metadata for the file */ int collect_metadata(uint32_t metaflags, struct collection_item **metadata, - FILE *config_file) + FILE *config_file, + const char *config_filename) { int error = EOK; + struct collection_item *metasec = NULL; + int filedes; + struct stat file_stats; TRACE_FLOW_STRING("collect_metadata", "Entry"); + /* Check and create section for file error if needed */ + if (metaflags & INI_META_SEC_ACCESS_FLAG) { + /* Create ACCESS collection */ + error = col_create_collection(&metasec, + INI_META_SEC_ACCESS, + COL_CLASS_INI_SECTION); + if (error) { + TRACE_ERROR_NUMBER("Failed to create access section.", error); + col_destroy_collection(metasec); + return error; + } + + filedes = fileno(config_file); + + /* Collect statistics */ + errno = 0; + if (fstat(filedes, &file_stats) < 0) { + error = errno; + TRACE_ERROR_NUMBER("Failed to get statistics.", error); + col_destroy_collection(metasec); + return error; + } + + /* Record statistics */ + /* UID */ + error = col_add_int_property(metasec, + NULL, + INI_META_KEY_UID, + file_stats.st_uid); + if (error) { + TRACE_ERROR_NUMBER("Failed to save uid", error); + col_destroy_collection(metasec); + return error; + } + + /* GID */ + error = col_add_int_property(metasec, + NULL, + INI_META_KEY_GID, + file_stats.st_gid); + if (error) { + TRACE_ERROR_NUMBER("Failed to save gid", error); + col_destroy_collection(metasec); + return error; + } + + /* PERMISSIONS */ + error = col_add_unsigned_property(metasec, + NULL, + INI_META_KEY_PERM, + file_stats.st_mode); + if (error) { + TRACE_ERROR_NUMBER("Failed to save permissions", error); + col_destroy_collection(metasec); + return error; + } + + /* Modification time stamp */ + error = col_add_int_property(metasec, + NULL, + INI_META_KEY_MODIFIED, + file_stats.st_mtime); + if (error) { + TRACE_ERROR_NUMBER("Failed to save modification time", error); + col_destroy_collection(metasec); + return error; + } + + /* Name */ + error = col_add_str_property(metasec, + NULL, + INI_META_KEY_NAME, + config_filename, + 0); + if (error) { + TRACE_ERROR_NUMBER("Failed to save file name", error); + col_destroy_collection(metasec); + return error; + } + + /* Device ID */ + error = col_add_int_property(metasec, + NULL, + INI_META_KEY_DEV, + file_stats.st_dev); + if (error) { + TRACE_ERROR_NUMBER("Failed to save inode", error); + col_destroy_collection(metasec); + return error; + } + + /* i-node */ + error = col_add_int_property(metasec, + NULL, + INI_META_KEY_INODE, + file_stats.st_ino); + if (error) { + TRACE_ERROR_NUMBER("Failed to save inode", error); + col_destroy_collection(metasec); + return error; + } + + /* Add section to metadata */ + error = col_add_collection_to_collection( + *metadata, + NULL, + NULL, + metasec, + COL_ADD_MODE_REFERENCE); + + col_destroy_collection(metasec); + + if (error) { + TRACE_ERROR_NUMBER("Failed to save file name", error); + return error; + } + } TRACE_FLOW_STRING("collect_metadata", "Exit"); return error; |