summaryrefslogtreecommitdiffstats
path: root/common/ini/ini_metadata.c
diff options
context:
space:
mode:
Diffstat (limited to 'common/ini/ini_metadata.c')
-rw-r--r--common/ini/ini_metadata.c127
1 files changed, 126 insertions, 1 deletions
diff --git a/common/ini/ini_metadata.c b/common/ini/ini_metadata.c
index 630de699b..a5d5109fc 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;