+ * Aliasing for network mail.
+ */
+int alias(char *name)
+{ /* process alias and routing info for mail */
+ FILE *fp;
+ int a, i;
+ char aaa[SIZ], bbb[SIZ];
+ char *ignetcfg = NULL;
+ char *ignetmap = NULL;
+ int at = 0;
+ char node[64];
+ char testnode[64];
+ char buf[SIZ];
+
+ char original_name[256];
+ safestrncpy(original_name, name, sizeof original_name);
+
+ striplt(name);
+ remove_any_whitespace_to_the_left_or_right_of_at_symbol(name);
+ stripallbut(name, '<', '>');
+
+ fp = fopen(file_mail_aliases, "r"); // when are we going to get rid of this?
+ if (fp == NULL) {
+ fp = fopen("/dev/null", "r");
+ }
+ if (fp == NULL) {
+ return (MES_ERROR);
+ }
+ strcpy(aaa, "");
+ strcpy(bbb, "");
+ while (fgets(aaa, sizeof aaa, fp) != NULL) {
+ while (isspace(name[0]))
+ strcpy(name, &name[1]);
+ aaa[strlen(aaa) - 1] = 0;
+ strcpy(bbb, "");
+ for (a = 0; aaa[a] != '\0'; ++a) {
+ if (aaa[a] == ',') {
+ strcpy(bbb, &aaa[a + 1]);
+ aaa[a] = 0;
+ break;
+ }
+ }
+ if (!strcasecmp(name, aaa))
+ strcpy(name, bbb);
+ }
+ fclose(fp);
+
+ /* Hit the email address directory */
+ if (CtdlDirectoryLookup(aaa, name, sizeof aaa) == 0) {
+ strcpy(name, aaa);
+ }
+
+ if (strcasecmp(original_name, name)) {
+ syslog(LOG_INFO, "internet_addressing: %s is being forwarded to %s", original_name, name);
+ }
+
+ /* Change "user @ xxx" to "user" if xxx is an alias for this host */
+ for (a=0; name[a] != '\0'; ++a) {
+ if (name[a] == '@') {
+ if (CtdlHostAlias(&name[a+1]) == hostalias_localhost) {
+ name[a] = 0;
+ syslog(LOG_DEBUG, "internet_addressing: changed to <%s>", name);
+ break;
+ }
+ }
+ }
+
+ /* determine local or remote type, see citadel.h */
+ at = haschar(name, '@');
+ if (at == 0) return(MES_LOCAL); /* no @'s - local address */
+ if (at > 1) return(MES_ERROR); /* >1 @'s - invalid address */
+ remove_any_whitespace_to_the_left_or_right_of_at_symbol(name);
+
+ /* figure out the delivery mode */
+ extract_token(node, name, 1, '@', sizeof node);
+
+ /* If there are one or more dots in the nodename, we assume that it
+ * is an FQDN and will attempt SMTP delivery to the Internet.
+ */
+ if (haschar(node, '.') > 0) {
+ return(MES_INTERNET);
+ }
+
+ /* Otherwise we look in the IGnet maps for a valid Citadel node.
+ * Try directly-connected nodes first...
+ */
+ ignetcfg = CtdlGetSysConfig(IGNETCFG);
+ for (i=0; i<num_tokens(ignetcfg, '\n'); ++i) {
+ extract_token(buf, ignetcfg, i, '\n', sizeof buf);
+ extract_token(testnode, buf, 0, '|', sizeof testnode);
+ if (!strcasecmp(node, testnode)) {
+ free(ignetcfg);
+ return(MES_IGNET);
+ }
+ }
+ free(ignetcfg);
+
+ /*
+ * Then try nodes that are two or more hops away.
+ */
+ ignetmap = CtdlGetSysConfig(IGNETMAP);
+ for (i=0; i<num_tokens(ignetmap, '\n'); ++i) {
+ extract_token(buf, ignetmap, i, '\n', sizeof buf);
+ extract_token(testnode, buf, 0, '|', sizeof testnode);
+ if (!strcasecmp(node, testnode)) {
+ free(ignetmap);
+ return(MES_IGNET);
+ }
+ }
+ free(ignetmap);
+
+ /* If we get to this point it's an invalid node name */
+ return (MES_ERROR);
+}
+
+
+/*
+ * Validate recipients, count delivery types and errors, and handle aliasing
+ * FIXME check for dupes!!!!!
+ *
+ * Returns 0 if all addresses are ok, ret->num_error = -1 if no addresses
+ * were specified, or the number of addresses found invalid.