/** * duser - Manage MajorDomo lists * Copyright (C) 2011 Joseph Hunkeler * * This file is part of duser. * * duser is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * duser is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with duser. If not, see . **/ #include #include #include #include #include #include #include #include #include #include #include #include #include "version.h" #include "cfg.h" #include "duser.h" char list_path[PATH_MAX]; char logfile[PATH_MAX]; static char progname[FILENAME_MAX]; int CMD_FLAG_NOOPT = 0; int CMD_FLAG_DEL = 0; int CMD_FLAG_DEL_ALL = 0; int CMD_FLAG_DEL_LIST = 0; int CMD_FLAG_MOD = 0; int CMD_FLAG_ADD = 0; int CMD_FLAG_LIST = 0; int CMD_FLAG_HELP = 0; int CMD_FLAG_LOOK = 0; int CMD_FLAG_NEW = 0; int CMD_FLAG_NULL = 0; void version() { printf("%s v%s.%s%s (%s %s)\n", progname, VER_MAJOR, VER_MINOR, VER_OTH, __DATE__, __TIME__); } void usage() { version(); printf("Usage: %s command [address [list]]\n", progname); printf("Commands:\n"); printf(" help This usage statement\n"); printf(" add Add a user to a list\n"); printf(" del Delete a user from a list\n"); printf(" delA Delete a user from all lists\n"); printf(" delL Completely delete a mailing list\n"); printf(" mod Modify a user in a list\n"); printf(" new Creates a new list\n"); printf(" list Find and list a user in all lists\n"); printf(" look Find user in specific list\n"); printf("\n"); exit(0); } int main(int argc, char* argv[]) { strncpy(progname, argv[0], strlen(argv[0])); if((cfg_open(CFG_PATH)) == 0) { cfg_get_key(list_path, "path"); cfg_get_key(logfile, "logfile"); cfg_close(); } else { fprintf(stderr, "%s: %s: %s\n", SELF, CFG_PATH, strerror(errno)); return -1; } char filename[PATH_MAX]; record_t *rec; const char* needle = argv[2]; const char* single_list = argv[3]; if(single_list) snprintf(filename, PATH_MAX, "%s%s", list_path, single_list); if(argc < 3) { usage(); return 0; } stats_init(&processed); user_cmd(argc, argv); if((strval(needle)) != 0) { fprintf(stderr, "%s: Invalid string\n", SELF); exit(1); } if(CMD_FLAG_DEL) { if(needle == NULL) { printf("You must specify an email address\n"); return -1; } else if(single_list == NULL) { printf("You must specify a list to remove '%s' from\n", needle); return -1; } if((rec = find_in_file(filename, needle)) == NULL) { printf("'%s' not found in '%s'\n", needle, basename(filename)); return -1; } printf("Please review the information below:\n\n"); printf("Email: %s\n", rec->name); printf("At line: %d\n", rec->index); printf("In File: %s\n", basename(rec->file)); printf("\nDo you wish to wish to delete this record? [y/N] "); char choice = getchar(); if((user_choice(choice)) == 0) { if((user_del(rec)) > 0) { printf("Record deleted\n"); COM(SELF, "Commmand: DELETE\n"); COM(SELF, "'%s' deleted from '%s' at line %d\n", rec->name, basename(rec->file), rec->index); } } else { printf("Aborting...\n"); } return 0; } if(CMD_FLAG_DEL_ALL) { user_del_all(needle); return 0; } if(CMD_FLAG_DEL_LIST) { user_del_list(needle); return 0; } if(CMD_FLAG_ADD) { if(needle == NULL) { printf("You must specify an email address\n"); return -1; } else if(single_list == NULL) { printf("You must specify a list in which to add '%s' to\n", needle); return -1; } printf("Please review the information below:\n\n");; printf("Email: %s\n", needle); printf("In File: %s\n", basename(filename)); printf("\nDo you wish to wish to add this record? [y/N] "); char choice = getchar(); if((user_choice(choice)) == 0) { if((user_add(filename, needle)) > 0) { printf("Record added\n"); COM(SELF, "Commmand: ADD\n"); COM(SELF, "'%s' added to '%s'\n", needle, basename(filename)); } } else { printf("Aborting...\n"); } return 0; } if(CMD_FLAG_MOD) { fprintf(stderr, "Not implemented, sorry.\n"); return 0; if(needle == NULL) { printf("You must specify an email address\n"); return -1; } else if(single_list == NULL) { printf("You must specify a list in which to modify '%s' in\n", needle); return -1; } return 0; } if(CMD_FLAG_LIST) { if(needle == NULL) { printf("You must specify an email address\n"); return -1; } user_list(needle); return 0; } if(CMD_FLAG_LOOK) { if(needle == NULL) { printf("You must specify an email address\n"); return -1; } else if(single_list == NULL) { printf("You must specify a list in which to find '%s' in\n", needle); return -1; } rec = find_in_file(filename, needle); if(rec) { if(rec->match) { printf("Found '%s' at line %d of list '%s'\n", rec->name, rec->index, basename(rec->file)); } else { printf("Corrupt record? This is not supposed to happen.\n"); return -1; } } else { printf("Not found in '%s'\n", single_list); } return 0; } if(CMD_FLAG_NEW) { fprintf(stderr, "Not implemented, sorry.\n"); return 0; memset(filename, 0L, PATH_MAX); snprintf(filename, PATH_MAX, "%s%s", list_path, needle); if(needle == NULL) { printf("You must specify a list to create\n"); return -1; } printf("Please review the information below:\n\n");; printf("File: %s\n", filename); printf("\nDo you wish to wish to create this list? [y/N] "); char choice = getchar(); if((user_choice(choice)) == 0) { if((mklist(filename)) == 0) { printf("List added\n"); COM(SELF, "Commmand: NEW\n"); COM(SELF, "Created new list '%s'\n", basename(filename)); } else { printf("Aborting...\n"); } } else { printf("Aborting...\n"); } return 0; } if(CMD_FLAG_HELP) { usage(); } if(CMD_FLAG_NULL) { fprintf(stderr, "Command not specified\n"); exit(1); } return 0; }