1: /* ali.c - the new ali */ 2: 3: #include "../h/mh.h" 4: #include "../h/addrsbr.h" 5: #include "../h/aliasbr.h" 6: #include <stdio.h> 7: 8: 9: #define NVEC 50 /* maximum number of names */ 10: 11: /* */ 12: 13: static struct swit switches[] = { 14: #define ALIASW 0 15: "alias aliasfile", 0, 16: #define NALIASW 1 17: "noalias", -7, 18: 19: #define LISTSW 2 20: "list", 0, 21: #define NLISTSW 3 22: "nolist", 0, 23: 24: #define NORMSW 4 25: "normalize", 0, 26: #define NNORMSW 5 27: "nonormalize", 0, 28: 29: #define USERSW 6 30: "user", 0, 31: #define NUSERSW 7 32: "nouser", 0, 33: 34: #define HELPSW 8 35: "help", 4, 36: 37: NULL, NULL 38: }; 39: 40: /* */ 41: 42: static int pos = 1; 43: 44: extern struct aka *akahead; 45: 46: /* */ 47: 48: /* ARGSUSED */ 49: 50: main (argc, argv) 51: int argc; 52: char *argv[]; 53: { 54: int i, 55: vecp = 0, 56: inverted = 0, 57: list = 0, 58: noalias = 0, 59: normalize = AD_NHST; 60: char *cp, 61: **ap, 62: **argp, 63: buf[100], 64: *vec[NVEC], 65: *arguments[MAXARGS]; 66: struct aka *ak; 67: 68: invo_name = r1bindex (argv[0], '/'); 69: mts_init (invo_name); 70: if ((cp = m_find (invo_name)) != NULL) { 71: ap = brkstring (cp = getcpy (cp), " ", "\n"); 72: ap = copyip (ap, arguments); 73: } 74: else 75: ap = arguments; 76: (void) copyip (argv + 1, ap); 77: argp = arguments; 78: 79: /* */ 80: 81: while (cp = *argp++) { 82: if (*cp == '-') 83: switch (smatch (++cp, switches)) { 84: case AMBIGSW: 85: ambigsw (cp, switches); 86: done (1); 87: case UNKWNSW: 88: adios (NULLCP, "-%s unknown", cp); 89: case HELPSW: 90: (void) sprintf (buf, "%s [switches] aliases ...", 91: invo_name); 92: help (buf, switches); 93: done (1); 94: 95: case ALIASW: 96: if (!(cp = *argp++) || *cp == '-') 97: adios (NULLCP, "missing argument to %s", argp[-2]); 98: if ((i = alias (cp)) != AK_OK) 99: adios (NULLCP, "aliasing error in %s - %s", 100: cp, akerror (i)); 101: continue; 102: case NALIASW: 103: noalias++; 104: continue; 105: 106: case LISTSW: 107: list++; 108: continue; 109: case NLISTSW: 110: list = 0; 111: continue; 112: 113: case NORMSW: 114: normalize = AD_HOST; 115: continue; 116: case NNORMSW: 117: normalize = AD_NHST; 118: continue; 119: 120: case USERSW: 121: inverted++; 122: continue; 123: case NUSERSW: 124: inverted = 0; 125: continue; 126: } 127: vec[vecp++] = cp; 128: } 129: 130: if (!noalias) 131: (void) alias (AliasFile); 132: 133: /* */ 134: 135: if (vecp) 136: for (i = 0; i < vecp; i++) 137: if (inverted) 138: print_usr (vec[i], list, normalize); 139: else 140: print_aka (akvalue (vec[i]), list, 0); 141: else { 142: if (inverted) 143: adios (NULLCP, "usage: %s addresses ... (you forgot the addresses)", 144: invo_name); 145: 146: for (ak = akahead; ak; ak = ak -> ak_next) { 147: printf ("%s: ", ak -> ak_name); 148: pos += strlen (ak -> ak_name) + 1; 149: print_aka (akresult (ak), list, pos); 150: } 151: } 152: 153: done (0); 154: } 155: 156: /* */ 157: 158: print_aka (p, list, margin) 159: register char *p; 160: int list, 161: margin; 162: { 163: register char c; 164: 165: if (p == NULL) { 166: printf ("<empty>\n"); 167: return; 168: } 169: 170: while (c = *p++) 171: switch (c) { 172: case ',': 173: if (*p) 174: if (list) 175: printf ("\n%*s", margin, ""); 176: else 177: if (pos >= 68) { 178: printf (",\n "); 179: pos = 2; 180: } 181: else { 182: printf (", "); 183: pos += 2; 184: } 185: 186: case NULL: 187: break; 188: 189: default: 190: pos++; 191: (void) putchar (c); 192: } 193: 194: (void) putchar ('\n'); 195: pos = 1; 196: } 197: 198: /* */ 199: 200: print_usr (s, list, norm) 201: register char *s; 202: int list, 203: norm; 204: { 205: register char *cp, 206: *pp, 207: *vp; 208: register struct aka *ak; 209: register struct mailname *mp, 210: *np; 211: 212: if ((pp = getname (s)) == NULL) 213: adios (NULLCP, "no address in \"%s\"", s); 214: if ((mp = getm (pp, NULLCP, 0, norm, NULLCP)) == NULL) 215: adios (NULLCP, "bad address \"%s\"", s); 216: while (getname ("")) 217: continue; 218: 219: vp = NULL; 220: for (ak = akahead; ak; ak = ak -> ak_next) { 221: pp = akresult (ak); 222: while (cp = getname (pp)) { 223: if ((np = getm (cp, NULLCP, 0, norm, NULLCP)) == NULL) 224: continue; 225: if (uleq (mp -> m_host, np -> m_host) 226: && uleq (mp -> m_mbox, np -> m_mbox)) { 227: vp = vp ? add (ak -> ak_name, add (",", vp)) 228: : getcpy (ak -> ak_name); 229: mnfree (np); 230: while (getname ("")) 231: continue; 232: break; 233: } 234: mnfree (np); 235: } 236: } 237: mnfree (mp); 238: 239: printf ("%s: ", s); 240: print_aka (vp ? vp : s, list, pos += strlen (s) + 1); 241: if (vp) 242: free (vp); 243: }