]>
diplodocus.org Git - nmh/blob - uip/ali.c
534c25d886fdec0a267a6e05823ea2b8b234bf47
3 * ali.c -- list nmh mail aliases
5 * This code is Copyright (c) 2002, by the authors of nmh. See the
6 * COPYRIGHT file in the root directory of the nmh distribution for
7 * complete copyright information.
11 #include <h/addrsbr.h>
12 #include <h/aliasbr.h>
16 #define ALI_SWITCHES \
17 X("alias aliasfile", 0, ALIASW) \
18 X("noalias", -7, NALIASW) \
19 X("list", 0, LISTSW) \
20 X("nolist", 0, NLISTSW) \
21 X("user", 0, USERSW) \
22 X("nouser", 0, NUSERSW) \
23 X("version", 0, VERSIONSW) \
24 X("help", 0, HELPSW) \
26 #define X(sw, minchars, id) id,
27 DEFINE_SWITCH_ENUM(ALI
);
30 #define X(sw, minchars, id) { sw, minchars, id },
31 DEFINE_SWITCH_ARRAY(ALI
, switches
);
36 extern struct aka
*akahead
;
41 static void print_aka (char *, int, int);
42 static void print_usr (char *, int);
46 main (int argc
, char **argv
)
48 int i
, vecp
= 0, inverted
= 0, list
= 0;
50 char *cp
, **ap
, **argp
, buf
[BUFSIZ
];
51 /* Really only need to allocate for argc-1, but must allocate at least 1,
52 so go ahead and allocate for argc char pointers. */
53 char **vec
= mh_xmalloc (argc
* sizeof (char *)), **arguments
;
56 setlocale(LC_ALL
, "");
57 invo_name
= r1bindex (argv
[0], '/');
59 /* read user profile/context */
63 arguments
= getarguments (invo_name
, argc
, argv
, 1);
66 while ((cp
= *argp
++)) {
68 switch (smatch (++cp
, switches
)) {
70 ambigsw (cp
, switches
);
73 adios (NULL
, "-%s unknown", cp
);
76 snprintf (buf
, sizeof(buf
), "%s [switches] aliases ...",
78 print_help (buf
, switches
, 1);
81 print_version (invo_name
);
85 if (!(cp
= *argp
++) || *cp
== '-')
86 adios (NULL
, "missing argument to %s", argp
[-2]);
87 if ((i
= alias (cp
)) != AK_OK
)
88 adios (NULL
, "aliasing error in %s - %s", cp
, akerror (i
));
113 /* Should never happen, but try to protect against code changes
114 that could allow it. */
115 adios (NULL
, "too many arguments");
120 /* allow Aliasfile: profile entry */
121 if ((cp
= context_find ("Aliasfile"))) {
124 for (ap
= brkstring(dp
= getcpy(cp
), " ", "\n"); ap
&& *ap
; ap
++)
125 if ((i
= alias (*ap
)) != AK_OK
)
126 adios (NULL
, "aliasing error in %s - %s", *ap
, akerror (i
));
134 * If -user is specified
138 adios (NULL
, "usage: %s -user addresses ... (you forgot the addresses)",
141 for (i
= 0; i
< vecp
; i
++)
142 print_usr (vec
[i
], list
);
145 /* print specified aliases */
146 for (i
= 0; i
< vecp
; i
++)
147 print_aka (akvalue (vec
[i
]), list
, 0);
150 for (ak
= akahead
; ak
; ak
= ak
->ak_next
) {
151 printf ("%s: ", ak
->ak_name
);
152 pos
+= strlen (ak
->ak_name
) + 1;
153 print_aka (akresult (ak
), list
, pos
);
164 print_aka (char *p
, int list
, int margin
)
169 printf ("<empty>\n");
178 printf ("\n%*s", margin
, "");
204 print_usr (char *s
, int list
)
206 register char *cp
, *pp
, *vp
;
207 register struct aka
*ak
;
208 register struct mailname
*mp
, *np
;
210 if ((pp
= getname (s
)) == NULL
)
211 adios (NULL
, "no address in \"%s\"", s
);
212 if ((mp
= getm (pp
, NULL
, 0, NULL
, 0)) == NULL
)
213 adios (NULL
, "bad address \"%s\"", s
);
218 for (ak
= akahead
; ak
; ak
= ak
->ak_next
) {
220 while ((cp
= getname (pp
))) {
221 if ((np
= getm (cp
, NULL
, 0, NULL
, 0)) == NULL
)
223 if (!strcasecmp (mp
->m_host
? mp
->m_host
: "",
224 np
->m_host
? np
->m_host
: "") &&
225 !strcasecmp (mp
->m_mbox
? mp
->m_mbox
: "",
226 np
->m_mbox
? np
->m_mbox
: "")) {
227 vp
= vp
? add (ak
->ak_name
, add (",", vp
))
228 : getcpy (ak
->ak_name
);
239 print_aka (vp
? vp
: s
, list
, 0);