1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <pwd.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cgdbm.h"
#include "addrbook.h"
#include "vsprintf.h"
#include "match.h"
#define SHOW_ERR fprintf(stderr, addr_info, SMSADDR)
const char *addr_info =
"Uzycie:\n\t%s -a nazwa numer | -r nazwa | -l [ nazwa ] | -s maska\n\n"\
"\t-a dodaje podana pozycje do ksiazki adresowej\n"\
"\t-r usuwa wpis o podanej nazwie z ksiazki adresowej\n"\
"\t-l wypisuje cala zawartosc bazy, lub tylko rekord o podanej nazwie\n"\
"\t-s wypisuje rekordy pasujace do podanej maski, np: ani*\n"\
"\t maski lepiej objac tutaj cudzyslowami, zeby shell sam z siebie\n"\
"\t ich nie popodmienial, czyli: smsaddr -s \"ani*\"\n\n"\
"Przy wysylaniu sms'ow zamiast numeru mozna podac nazwe pozycji z ksiazki\n"\
"adresowej. Numery nalezy podawac w takim formacie jak dla programu sms, czyli\n"\
"bez kodu kraju, np: 602123456\n\n"\
"Mikolaj Rydzewski, <miki@ceti.pl>\n";
// funkcja wyznaczy pelna nazwe pliku ksiazki adresowej - bedzie on w glownym
// katalogu katalogu domowego usera, ktory program uruchomil
char *getdb_filename()
{
struct passwd *pwd;
struct stat buf;
static char file[MAXPATHLEN];
char *path;
if (!(pwd = getpwuid(getuid()))) return NULL;
if ((path = getenv("CONFIG_DIR")) && *path)
snprintf(file, sizeof(file)-1, "%s/%s/%s",pwd->pw_dir, path, ADDRDB);
else
snprintf(file, sizeof(file)-1, "%s/.%s", pwd->pw_dir, ADDRDB);
return file;
}
int addr_main(int argc, char **argv)
{
if (argc < 2) {
SHOW_ERR;
return 1;
}
Cgdbm db;
char *db_file = getdb_filename();
if (!db_file) return -1;
switch (*(++argv[1])) {
case 'a':
if (argc == 4) {
db.Open(db_file, 0, GDBM_WRCREAT);
if (!db.Status()) {
fprintf(stderr,"Nie moge utworzyc pliku ksiazki.\n");
return 1;
}
Cdatum nazwa(argv[2]);
Cdatum numer(argv[3]);
if (db.Insert(nazwa, numer) == 1)
printf("Podany klucz juz istnieje w ksiazce.\n");
} else SHOW_ERR;
break;
case 's': {
db.Open(db_file, 0, GDBM_READER);
if (!db.Status()) {
fprintf(stderr,"Nie moge otworzyc pliku ksiazki.\n");
return 1;
}
if (argc == 3) {
char *glob = argv[2];
Cdatum nazwa = db.FirstKey();
while (!nazwa.IsNull()) {
Cdatum &numer = db.Fetch(nazwa);
if (match(glob, (char*)(const char*)nazwa))
printf("%s%s%s\n", (const char*)nazwa,
(strlen((const char*)nazwa)<8)?"\t\t\t":"\t\t",
(const char*)numer);
delete &numer;
nazwa = db.NextKey(nazwa);
}
} else SHOW_ERR;
}
break;
case 'l': {
db.Open(db_file, 0, GDBM_READER);
if (!db.Status()) {
fprintf(stderr,"Nie moge otworzyc pliku ksiazki.\n");
return 1;
}
if (argc == 3) {
Cdatum nazwa(argv[2]);
if (db.Exists(nazwa)) {
Cdatum &numer = db.Fetch(nazwa);
printf("%s%s%s\n", (const char*)nazwa,
(strlen((const char*)nazwa)<8)?"\t\t\t":"\t\t",
(const char*)numer);
delete &numer;
} else printf("Brak podanego klucza w ksiazce.\n");
} else {
Cdatum nazwa = db.FirstKey();
while (!nazwa.IsNull()) {
Cdatum &numer = db.Fetch(nazwa);
printf("%s%s%s\n", (const char*)nazwa,
(strlen((const char*)nazwa)<8)?"\t\t\t":"\t\t",
(const char*)numer);
delete &numer;
nazwa = db.NextKey(nazwa);
}
}
}
break;
case 'r': {
if (argc == 3) {
db.Open(db_file, 0, GDBM_WRITER);
if (!db.Status()) {
fprintf(stderr,"Nie moge otworzyc pliku ksiazki.\n");
return 1;
}
Cdatum nazwa(argv[2]);
if (db.Delete(nazwa) == -1) printf("Brak podanego klucza w ksiazce.\n");
else db.Reorganize();
} else SHOW_ERR;
}
break;
default: SHOW_ERR;
}
return 0;
}
char *lookup_addrbook(const char *key, char *buf, int size)
{
char *df = getdb_filename();
if (!df) return NULL;
Cgdbm db(df, 0, GDBM_READER);
if (!db.Status()) return NULL;
Cdatum nazwa(key);
if (db.Exists(nazwa)) {
Cdatum &numer = db.Fetch(nazwa);
strncpy(buf, (const char*)numer, size);
delete &numer;
return buf;
}
return NULL;
}
|