続 pwd_mkdb(8)

/etc/pwd.db に VERSION キーがあるか確認するためのソース。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <db.h>
#include <pwd.h>

int
main(void)
{
	const char *dbfile = "/etc/pwd.db";
	DB *db;
	DBT key, value;
	int version;
	int found = 0;

	db = dbopen(dbfile, O_RDONLY, 0, DB_HASH, NULL);
	if (db == NULL) {
		fprintf(stderr, "couldn't open %s\n", dbfile);
		return 1;
	}

	key.data = "VERSION";
	key.size = strlen((char *)key.data) + 1;
	switch ((*db->get)(db, &key, &value, 0)) {
	case 0:
		if (sizeof(version) == value.size) {
			/* found */
			found = 1;
			(void)memcpy(&version, value.data, value.size);
			break;
		}
		fprintf(stderr, "error: key size incollect\n");
		/*FALLTROUGH*/
	case 1:		/* not found */
		break;

	case -1:	/* error in db routines */
	default:
		fprintf(stderr, "error: error in db routines\n");
		break;
	}

	(*db->close)(db);

	printf("file: %s\n", dbfile);
	if (found) {
		printf("version: %d\n", version);
	} else {
		printf("not found\n");
	}

	return 0;
}