summaryrefslogtreecommitdiff
path: root/usr/src/cmd/sendmail/aux/aliasadm.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/cmd/sendmail/aux/aliasadm.c')
-rw-r--r--usr/src/cmd/sendmail/aux/aliasadm.c218
1 files changed, 218 insertions, 0 deletions
diff --git a/usr/src/cmd/sendmail/aux/aliasadm.c b/usr/src/cmd/sendmail/aux/aliasadm.c
new file mode 100644
index 0000000000..21b1a5a963
--- /dev/null
+++ b/usr/src/cmd/sendmail/aux/aliasadm.c
@@ -0,0 +1,218 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "nisplus.h"
+
+#define DEFAULT_ALIAS_MAP "mail_aliases.org_dir"
+
+static FILE *fp = NULL;
+static char *domain, *alias_map;
+static char *match_arg;
+
+static struct nis_mailias alias = {NULL, NULL, NULL, NULL};
+
+typedef enum t_mode {
+ AA_NONE,
+ AA_ADD,
+ AA_CHANGE,
+ AA_DELETE,
+ AA_EDIT,
+ AA_MATCH,
+ AA_LIST,
+ AA_INIT
+} t_mode;
+
+static t_mode mode;
+
+static void argparse();
+static void usage();
+
+int
+main(argc, argv)
+ int argc;
+ char **argv;
+{
+ nis_result *res;
+
+ print_comments = TRUE;
+
+ alias_map = DEFAULT_ALIAS_MAP;
+
+ if ((domain = nis_local_directory()) == NULL) {
+ fprintf(stderr, "Can't get current domain\n");
+ exit(-1);
+ }
+
+ argparse(argc, argv);
+
+ switch (mode) {
+ case AA_ADD:
+ nis_mailias_add(alias, alias_map, domain);
+ break;
+ case AA_CHANGE:
+ nis_mailias_change(alias, alias_map, domain);
+ break;
+ case AA_DELETE:
+ nis_mailias_delete(alias, alias_map, domain);
+ break;
+ case AA_MATCH:
+ res = nis_mailias_match(match_arg,
+ alias_map, domain, ALIAS_COL);
+ if (res->status == SUCCESS) {
+ int i;
+ for (i = 0; i < res->objects.objects_len; i++)
+ mailias_print(fp? fp: stdout,
+ (&res->objects.objects_val[0])+i);
+ }
+ break;
+ case AA_LIST:
+ nis_mailias_list(fp? fp: stdout, alias_map, domain);
+ break;
+ case AA_INIT:
+ nis_mailias_init(alias_map, domain);
+ break;
+ case AA_EDIT:
+ nis_mailias_edit(fp, alias_map, domain);
+ break;
+ case AA_NONE:
+ default:
+ usage(argv[0]);
+ exit(-1);
+ break;
+ }
+ return (0);
+}
+
+static void
+argparse(argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int narg;
+ int ind;
+
+ mode = AA_NONE;
+
+ while ((c = getopt(argc, argv, "D:M:f:a:c:d:m:leIn")) != EOF) {
+ /*
+ * optind doesn't seem to be recognized as an extern int
+ * (which it is). For now, cast it.
+ */
+ ind = (int)optind;
+ switch (c) {
+ case 'a':
+ mode = AA_ADD;
+ narg = argc - ind + 1;
+ if (narg < 2) {
+ usage(argv[0]);
+ fprintf(stderr, "Invalid argument\n");
+ exit(-1);
+ }
+ alias.name = strdup(optarg);
+ alias.expn = strdup(argv[ind]);
+ if (narg >= 3 && *argv[ind + 1] != '-')
+ alias.comments = strdup(argv[ind + 1]);
+ if (narg >= 4 && *argv[ind + 1] != '-' &&
+ *argv[ind + 2] != '-') {
+ alias.options = strdup(argv[ind + 2]);
+ }
+ break;
+ case 'c':
+ mode = AA_CHANGE;
+ narg = argc - ind + 1;
+ if (narg < 2) {
+ usage(argv[0]);
+ fprintf(stderr, "Invalid argument\n");
+ exit(-1);
+ }
+ alias.name = optarg;
+ alias.expn = strdup(argv[ind]);
+ if (narg >= 3 && *argv[ind + 1] != '-')
+ alias.comments = strdup(argv[ind + 1]);
+ if (narg >= 4 && *argv[ind + 1] != '-' &&
+ *argv[ind + 2] != '-') {
+ alias.options = strdup(argv[ind + 2]);
+ }
+ break;
+ case 'D':
+ domain = strdup(optarg);
+ break;
+ case 'd':
+ mode = AA_DELETE;
+ alias.name = strdup(optarg);
+ break;
+ case 'M':
+ alias_map = strdup(optarg);
+ break;
+ case 'm':
+
+ mode = AA_MATCH;
+ match_arg = strdup(optarg);
+ break;
+ case 'n':
+ print_comments = FALSE;
+ break;
+ case 'f':
+ fp = fopen(optarg, "a+");
+ if (fp == NULL) {
+ fprintf(stderr, "%s:", optarg);
+ perror("Can not open:");
+ exit(-1);
+ }
+ break;
+ case 'e':
+ mode = AA_EDIT;
+ break;
+ case 'l':
+ mode = AA_LIST;
+ break;
+ case 'I':
+ mode = AA_INIT;
+ break;
+ default:
+ fprintf(stderr, "Invalid argument\n");
+ usage(argv[0]);
+ exit(-1);
+ break;
+ }
+ }
+}
+
+static void
+usage(pname)
+ char *pname;
+{
+ fprintf(stderr,
+ "usage:\t%s -a alias expansion [comments] [options]\n", pname);
+ fprintf(stderr, "\t%s -c alias expansion [comments] [options]\n",
+ pname);
+ fprintf(stderr, "\t%s -e\n", pname);
+ fprintf(stderr, "\t%s -d alias\n", pname);
+ fprintf(stderr, "\t%s -m alias\n", pname);
+ fprintf(stderr, "\t%s -l\n", pname);
+}