]> ruderich.org/simon Gitweb - nsscash/nsscash.git/commitdiff
nss: improve comments
authorSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2019 21:00:25 +0000 (23:00 +0200)
committerSimon Ruderich <simon@ruderich.org>
Mon, 10 Jun 2019 21:00:25 +0000 (23:00 +0200)
nss/file.c
nss/file.h
nss/gr.c
nss/pw.c
nss/search.c
nss/search.h

index 6da0fd656663a6402db230d0f57a11b4abeb88d8..ba6c481a85daabae43873dd0e03a9fd95be51925 100644 (file)
@@ -41,8 +41,9 @@ bool map_file(const char *path, struct file *f) {
     if (fstat(f->fd, &s)) {
         goto fail;
     }
-    f->size = (size_t)s.st_size;
+    f->size = (size_t)s.st_size; // for munmap()
 
+    // mmap is used for speed and simple random access
     void *x = mmap(NULL, f->size, PROT_READ, MAP_PRIVATE, f->fd, 0);
     if (x == MAP_FAILED) {
         goto fail;
index 9560bc3379182edbcabd94ce14e7756b622de4d6..fb94a8f2017d29c242d484dee4c87a7bce945f81 100644 (file)
@@ -25,6 +25,8 @@
 #include <stdlib.h>
 
 
+// Magic value at the beginning of each nsscash file (8 byte, without the
+// trailing NUL)
 #define MAGIC "NSS-CASH"
 
 // Defined in Makefile
 #endif
 
 
+// header describes the on-disk (and, after loading via mmap, in-memory)
+// structure of nsscash files.
 struct header {
     char magic[8]; // magic string
     uint64_t version; // also doubles as byte-order check
 
-    uint64_t count;
+    uint64_t count; // number of entries in this file
 
     // All offsets are relative to data
     uint64_t off_orig_index;
@@ -51,6 +55,7 @@ struct header {
     char data[];
 } __attribute__((packed));
 
+// file represents an open nsscash file.
 struct file {
     int fd;
     size_t size;
index d8d6d6a1520109b9a94384e5098e816e1618c936..db822094990c34044f6533c0f564ed9be90d36b6 100644 (file)
--- a/nss/gr.c
+++ b/nss/gr.c
@@ -35,7 +35,7 @@
 struct group_entry {
     uint64_t gid;
 
-    //       off_name = 0
+    //       off_name = 0, not stored on disk
     uint16_t off_passwd;
     uint16_t off_mem_off;
 
@@ -51,11 +51,12 @@ struct group_entry {
      *
      * All offsets are relative to the beginning of data.
      */
-    uint16_t data_size;
+    uint16_t data_size; // size of data in bytes
     const char data[];
 } __attribute__((packed));
 
 static bool entry_to_group(const struct group_entry *e, struct group *g, char *tmp, size_t space) {
+    // Space required for the gr_mem array
     const size_t mem_size = (size_t)(e->mem_count + 1) * sizeof(char *);
 
     if (space < e->data_size + mem_size) {
index c772bb10133e2d7c29feb4565f6327739cb2497e..e95ec38c0b07db3b787be4302f027392a7c09c38 100644 (file)
--- a/nss/pw.c
+++ b/nss/pw.c
@@ -36,18 +36,18 @@ struct passwd_entry {
     uint64_t uid;
     uint64_t gid;
 
-    //       off_name = 0
+    //       off_name = 0, not stored on disk
     uint16_t off_passwd;
     uint16_t off_gecos;
     uint16_t off_dir;
     uint16_t off_shell;
 
-    uint16_t data_size;
     /*
      * Data contains all strings (name, passwd, gecos, dir, shell)
      * concatenated, with their trailing NUL. The off_* variables point to
      * beginning of each string.
      */
+    uint16_t data_size; // size of data in bytes
     const char data[];
 } __attribute__((packed));
 
index 256001f16e1d19ac4b03706a81dee8266859ffc6..666d54c7bdec3785c2477ba8376c088f5be70e79 100644 (file)
 static int bsearch_callback(const void *x, const void *y) {
     const struct search_key *key = x;
 
-    uint64_t offset = *(const uint64_t *)y;
+    uint64_t offset = *(const uint64_t *)y; // from index
     const void *member = (const char *)key->data + offset + key->offset;
 
-    // Lookup by name
+    // Lookup by name (char *)
     if (key->name != NULL) {
         const char *name = member;
         return strcmp(key->name, name);
 
-    // Lookup by ID
+    // Lookup by ID (uint64_t)
     } else if (key->id != NULL) {
         const uint64_t *id = member;
         if (*key->id < *id) {
@@ -50,6 +50,7 @@ static int bsearch_callback(const void *x, const void *y) {
     }
 }
 
+// search performs a binary search on an index, described by key and index.
 uint64_t *search(const struct search_key *key, const void *index, uint64_t count) {
     return bsearch(key, index, count, sizeof(uint64_t), bsearch_callback);
 }
index 5a1b52e59a524accca32b966d9f421d17ea930f8..f3fbc9a3af13924665791f7ac07014193eff1de2 100644 (file)
 
 
 struct search_key {
-    const char *name;
-    const uint64_t *id;
+    const char *name; // if name != NULL search for a string
+    const uint64_t *id; // if name == NULL search for an id
 
+    // The actual data with all entries; this is where the full entry
+    // including name/id is located (the index holds an offset into data for
+    // each entry)
     const void *data;
+    // Static offset to the search key (name/id) inside the entry; after it
+    // was located by using the index's offset into data
     uint64_t offset;
 };