#include #include #include #include #include typedef struct { char key[20]; char value[20]; } list_entry; char *dictionary_file_name = "./my-dict"; char *tmp_name = "./.my-dict.tmp"; int add_entry(char **args) { char *key = args[0], *value = args[1]; FILE *dict = fopen(dictionary_file_name, "rb"); FILE *out = fopen(tmp_name, "wb"); if (!out) { perror(tmp_name); /* permission denied, for example */ return -1; } int found = 0; /* Have we found the entry? */ if (dict) { /* XXX what if we failed because permission denied? */ for (;;) { list_entry my_entry; if (!fread(&my_entry, sizeof my_entry, 1, dict)) break; if (0 == strcmp(my_entry.key, key)) { if (strlcpy(my_entry.value, value, sizeof my_entry.value) >= sizeof my_entry.value) abort(); found = 1; } fwrite(&my_entry, sizeof my_entry, 1, out); /* XXX error checking, e.g., disk full */ } fclose(dict); } if (!found) { list_entry my_entry; if (strlcpy(my_entry.key, args[0], sizeof my_entry.key) >= sizeof my_entry.key) abort(); if (strlcpy(my_entry.value, args[1], sizeof my_entry.value) >= sizeof my_entry.value) abort(); fwrite(&my_entry, sizeof my_entry, 1, out); /* XXX what is wrong with you */ } fflush(out); fsync(fileno(out)); /* ensure data is actually written to file */ fclose(out); if (rename(tmp_name, dictionary_file_name)) { perror("rename"); return -1; } return 0; /* success */ } list_entry *find_entry(char *keyname) { static list_entry my_entry; FILE *dict = fopen(dictionary_file_name, "rb"); if (!dict) { perror(dictionary_file_name); return 0; } for (;;) { if (!fread(&my_entry, sizeof my_entry, 1, dict)) break; if (0 == strcmp(my_entry.key, keyname)) { return &my_entry; } } return 0; } int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s --add key value # to add key=value to the db\n", argv[0]); fprintf(stderr, "or: %s key # to look up the key\n", argv[0]); return -1; } if (0 == strcmp(argv[1], "--add")) { return add_entry(argv+2); } else { list_entry *result = find_entry(argv[1]); if (result) { printf("%s = %s\n", result->key, result->value); return 0; } else { printf("Not found\n"); return -1; } } }