Added and implemented Silc DIR API.
[crypto.git] / lib / silcutil / silcdir.h
diff --git a/lib/silcutil/silcdir.h b/lib/silcutil/silcdir.h
new file mode 100644 (file)
index 0000000..25fb314
--- /dev/null
@@ -0,0 +1,240 @@
+/*
+
+  silcdir.h
+
+  Author: Pekka Riikonen <priikone@silcnet.org>
+
+  Copyright (C) 2008 Pekka Riikonen
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; version 2 of the License.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+*/
+
+/****h* silcutil/SILC Directory Interface
+ *
+ * DESCRIPTION
+ *
+ * The SILC Directory API provides portable way to open and read directories
+ * and their content.
+ *
+ * EXAMPLE
+ *
+ * SilcDir dir;
+ * SilcDirEntry entry;
+ *
+ * dir = silc_dir_open("foodir");
+ *
+ * while ((entry = silc_dir_read(dir, NULL)))
+ *   printf("File name: %s", silc_dir_entry_name(entry));
+ *
+ * silc_dir_close(dir);
+ *
+ ***/
+
+#ifndef SILCDIR_H
+#define SILCDIR_H
+
+/****s* silcutil/SilcDirAPI/SilcDir
+ *
+ * NAME
+ *
+ *    typedef struct SilcDirStruct *SilcDir;
+ *
+ * DESCRIPTION
+ *
+ *    The directory context.  This is allocated by silc_dir_open and
+ *    freed by calling silc_dir_close.
+ *
+ ***/
+typedef struct SilcDirStruct *SilcDir;
+
+/****s* silcutil/SilcDirAPI/SilcDirEntry
+ *
+ * NAME
+ *
+ *    typedef struct SilcDirEntryStruct *SilcDirEntry;
+ *
+ * DESCRIPTION
+ *
+ *    The directory entry context.  The entry is usually a file in the
+ *    directory.
+ *
+ ***/
+typedef struct SilcDirEntryStruct *SilcDirEntry;
+
+/****d* silcutil/SilcDirAPI/SilcDirEntryModen
+ *
+ * NAME
+ *
+ *    typedef enum { ... } SilcDirEntryMode;
+ *
+ * DESCRIPTION
+ *
+ *    The directory entry mode bits.  These bits specify the entry mode,
+ *    type and protection.
+ *
+ ***/
+typedef enum {
+  /* Type */
+  SILC_DIR_ENTRY_IFDIR     = 0x00000001,  /* Entry is directory */
+  SILC_DIR_ENTRY_IFCHR     = 0x00000002,  /* Entry is character device */
+  SILC_DIR_ENTRY_IFBLK     = 0x00000004,  /* Entry is block device */
+  SILC_DIR_ENTRY_IFREG     = 0x00000008,  /* Entry is regular file */
+  SILC_DIR_ENTRY_IFIFO     = 0x00000010,  /* Entry is FIFO */
+  SILC_DIR_ENTRY_IFLNK     = 0x00000020,  /* Entry is symbolic link */
+  SILC_DIR_ENTRY_IFSOCK    = 0x00000040,  /* Entry is socket */
+
+  /* Protection */
+  SILC_DIR_ENTRY_IRUSR     = 0x00000080,  /* Owner has read permission */
+  SILC_DIR_ENTRY_IWUSR     = 0x00000100,  /* Owner has write permission */
+  SILC_DIR_ENTRY_IXUSR     = 0x00000200,  /* Owner has execute permission */
+  SILC_DIR_ENTRY_IRGRP     = 0x00000400,  /* Group has read permission */
+  SILC_DIR_ENTRY_IWGRP     = 0x00000800,  /* Group has write permission */
+  SILC_DIR_ENTRY_IXGRP     = 0x00001000,  /* Group has execute permission */
+  SILC_DIR_ENTRY_IROTH     = 0x00002000,  /* Others have read permission */
+  SILC_DIR_ENTRY_IWOTH     = 0x00004000,  /* Others have write permission */
+  SILC_DIR_ENTRY_IXOTH     = 0x00008000,  /* Others have execute permission */
+} SilcDirEntryMode;
+
+/****s* silcutil/SilcDirAPI/SilcDirEntryStat
+ *
+ * NAME
+ *
+ *    typedef struct SilcDirEntryObject { ... } *SilcDirEntryStat,
+ *                                               SilcDirEntryStatStruct;
+ *
+ * DESCRIPTION
+ *
+ *    The directory entry status information structure.  The structure
+ *    contains various information about the entry in the directory.
+ *    This context is returned by silc_dir_read or silc_dir_entry_stat.
+ *
+ ***/
+typedef struct SilcDirEntryStatObject {
+  SilcTimeStruct last_access;          /* Time of last access */
+  SilcTimeStruct last_mod;             /* Time of last modification */
+  SilcTimeStruct last_change;          /* Time of last status change */
+  SilcUInt64 size;                     /* Entry size in bytes */
+  SilcUInt32 uid;                      /* Owner ID of the entry */
+  SilcUInt32 gid;                      /* Group owner ID of the entry */
+  SilcUInt32 dev;                      /* Entry device number */
+  SilcUInt32 nlink;                    /* Number of hard links */
+  SilcDirEntryMode mode;               /* Entry mode */
+} *SilcDirEntryStat, SilcDirEntryStatStruct;
+
+/****f* silcutil/SilcDirAPI/silc_dir_open
+ *
+ * SYNOPSIS
+ *
+ *    SilcDir silc_dir_open(const char *name);
+ *
+ * DESCRIPTION
+ *
+ *    Opens the directory named `name' and returns its context.  Returns NULL
+ *    on error and sets the silc_errno.  This function must be called before
+ *    being able to read the directory and its contents.
+ *
+ ***/
+SilcDir silc_dir_open(const char *name);
+
+/****f* silcutil/SilcDirAPI/silc_dir_close
+ *
+ * SYNOPSIS
+ *
+ *    void silc_dir_close(SilcDir dir);
+ *
+ * DESCRIPTION
+ *
+ *    Closes the directory `dir'.
+ *
+ ***/
+void silc_dir_close(SilcDir dir);
+
+/****f* silcutil/SilcDirAPI/silc_dir_read
+ *
+ * SYNOPSIS
+ *
+ *    SilcDirEntry silc_dir_read(SilcDir dir, SilcDirEntryStat *status);
+ *
+ * DESCRIPTION
+ *
+ *    Reads next entry (file) from the directory `dir'.  The silc_dir_open
+ *    must be called first before reading from the directory.  Returns the
+ *    next entry context or NULL if there are no more entries or error occurs.
+ *    In case of error the silc_errno is also set.
+ *
+ *    If the `status' is non-NULL this will also call silc_dir_entry_stat
+ *    and returns the status into the `status' pointer.
+ *
+ *    The returned context remains valid until the silc_dir_read is called
+ *    again.
+ *
+ ***/
+SilcDirEntry silc_dir_read(SilcDir dir, SilcDirEntryStat *status);
+
+/****f* silcutil/SilcDirAPI/silc_dir_rewind
+ *
+ * SYNOPSIS
+ *
+ *    void silc_dir_rewind(SilcDir dir);
+ *
+ * DESCRIPTION
+ *
+ *    Rewinds the directory `dir' to the beginning of the directory.  Calling
+ *    silc_dir_read after this will return the first entry in the directory.
+ *
+ ***/
+void silc_dir_rewind(SilcDir dir);
+
+/****f* silcutil/SilcDirAPI/silc_dir_name
+ *
+ * SYNOPSIS
+ *
+ *    const char *silc_dir_name(SilcDir dir);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the name of the directory from `dir' context.
+ *
+ ***/
+const char *silc_dir_name(SilcDir dir);
+
+/****f* silcutil/SilcDirAPI/silc_dir_entry_name
+ *
+ * SYNOPSIS
+ *
+ *    const char *silc_dir_entry_name(SilcDirEntry entry);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the name of the entry (file) `entry'.  The returned pointer
+ *    remains valid until the silc_dir_read is called again.
+ *
+ ***/
+const char *silc_dir_entry_name(SilcDirEntry entry);
+
+/****f* silcutil/SilcDirAPI/silc_dir_entry_stat
+ *
+ * SYNOPSIS
+ *
+ *    SilcDirEntryStat silc_dir_entry_stat(SilcDir dir, SilcDirEntry entry);
+ *
+ * DESCRIPTION
+ *
+ *    Returns the status of the entry.  The status context contains details
+ *    of the entry (file) in the directory.  Returns NULL on error and sets
+ *    the silc_errno.
+ *
+ *    The returned contest is valid until the silc_dir_read is called again.
+ *
+ ***/
+SilcDirEntryStat silc_dir_entry_stat(SilcDir dir, SilcDirEntry entry);
+
+#endif /* SILCDIR_H */