#include <pthread.h>
-#include "cash.h"
#include "cash_nss.h"
#include "file.h"
#include "search.h"
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;
*
* All offsets are relative to the beginning of data.
*/
- uint16_t data_size;
- char data[];
+ 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) {
const struct header *h = f.header;
key->data = h->data + h->off_data;
- uint64_t off_index = (key->id != NULL)
- ? h->off_id_index
- : h->off_name_index;
+ uint64_t off_index = (key->name != NULL)
+ ? h->off_name_index
+ : h->off_id_index;
uint64_t *off = search(key, h->data + off_index, h->count);
if (off == NULL) {
unmap_file(&f);
return NSS_STATUS_NOTFOUND;
}
- const char *e = h->data + h->off_data + *off;
+ const char *e = key->data + *off;
if (!entry_to_group((struct group_entry *)e, result, buffer, buflen)) {
unmap_file(&f);
errno = ERANGE;