|
|
1.1 ! root 1: #include "string.h" ! 2: #include "addrformat.h" ! 3: #include <stdio.h> ! 4: ! 5: /* ! 6: * Convert from `bang' to `%@' format or `source routing' format ! 7: * or `mixed rfc976' format. ! 8: * Let a!b!c!d be addr with host prepended if not gatewaying: ! 9: * ! 10: * a!b!c!d -> d%c%[email protected] (format==PERCENT) ! 11: * -> @a.domain,@b:d@c (format==SOURCEROUTE) ! 12: * -> [email protected] (format==RFC976) ! 13: * ! 14: * where the .domain is added only if domain!=0 and 'a' has no '.'s ! 15: * ! 16: * a!b!uucp!c!d -> c!d%[email protected] or @a.domain:c!d@b ! 17: * ! 18: * Or, if addr has one component only: ! 19: * ! 20: * a -> [email protected] if host!=0 ! 21: */ ! 22: extern char * ! 23: convertaddr(addr, domain, format) ! 24: char *addr; ! 25: char *domain; ! 26: { ! 27: static string *buf; ! 28: register int i=0; ! 29: register char *sp; ! 30: int j, d; ! 31: char *field[128]; ! 32: ! 33: /* parse the '!' format address */ ! 34: buf = s_reset(buf); ! 35: field[i] = addr; ! 36: sp = addr; ! 37: while (*sp) { ! 38: if (*sp == '!') { ! 39: *sp = '\0'; ! 40: if (strcmp(field[i], "uucp") == 0) { ! 41: /* the token 'uucp' stops the parsing */ ! 42: field[i] = ++sp; ! 43: break; ! 44: } ! 45: field[++i] = ++sp; ! 46: if(format==RFC976) ! 47: break; ! 48: } else ! 49: ++sp; ! 50: } ! 51: if (buf==NULL) ! 52: buf= s_new(); ! 53: s_restart(buf); ! 54: if (i==0) { ! 55: s_append(buf, field[0]); ! 56: } else { ! 57: if (format!=SOURCEROUTE) { ! 58: s_append(buf, field[i--]); ! 59: while (i>=1) { ! 60: s_append(buf, "%"); ! 61: s_append(buf, field[i--]); ! 62: } ! 63: addhostdom(buf, field[0], domain); ! 64: } else { ! 65: /* ! 66: * count leading domain fields (non-domains don't count) ! 67: */ ! 68: d = 0; ! 69: if(domain || strchr(field[0], '.')) ! 70: d++; ! 71: for( ; d<i; d++) ! 72: if(strchr(field[d], '.')==0) ! 73: break; ! 74: /* ! 75: * if there are more than 1 leading domain elements, ! 76: * put them in as source routing ! 77: */ ! 78: if(d > 1){ ! 79: addhostdom(buf, field[0], domain); ! 80: for(j=1; j<d-1; j++){ ! 81: s_append(buf, ","); ! 82: s_append(buf, "@"); ! 83: s_append(buf, field[j]); ! 84: } ! 85: s_append(buf, ":"); ! 86: } ! 87: ! 88: /* ! 89: * throw in the non-domain elements separated by '!'s ! 90: */ ! 91: s_append(buf, field[d]); ! 92: for(j=d+1; j<=i; j++) { ! 93: s_append(buf, "!"); ! 94: s_append(buf, field[j]); ! 95: } ! 96: if(d) ! 97: addhostdom(buf, field[d-1], domain); ! 98: } ! 99: } ! 100: return s_to_c(s_copy(s_to_c(buf))); ! 101: } ! 102: ! 103: addhostdom(buf, host, dom) ! 104: string *buf; ! 105: char *host; ! 106: char *dom; ! 107: { ! 108: char *cp; ! 109: ! 110: s_append(buf, "@"); ! 111: s_append(buf, host); ! 112: if(dom && !strchr(host, '.')){ ! 113: cp = strchr(dom, '.'); ! 114: if(cp!=NULL) ! 115: s_append(buf, cp); ! 116: } ! 117: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.