Back to index

courier  0.68.2
smtproutes.c
Go to the documentation of this file.
00001 /*
00002 ** Copyright 1998 - 2001 Double Precision, Inc.
00003 ** See COPYING for distribution information.
00004 */
00005 
00006 #if    HAVE_CONFIG_H
00007 #include      "config.h"
00008 #endif
00009 #include      "courier.h"
00010 #include      "smtproutes.h"
00011 #include      "dbobj.h"
00012 #include      <string.h>
00013 #include      <stdlib.h>
00014 #include      <ctype.h>
00015 
00016 
00017 static char *get_control_smtproutes()
00018 {
00019 char *filename=config_localfilename("esmtproutes");
00020 char *buf=readfile(filename, 0);
00021 
00022        free(filename);
00023        if (!buf)     return (0);
00024 
00025        removecomments(buf);
00026        return (buf);
00027 }
00028 
00029 static char *fetch_smtproutes(const char *domain)
00030 {
00031 char   *buf=get_control_smtproutes();
00032 const char *p=buf;
00033 
00034        if (!buf)
00035        {
00036        struct dbobj d;
00037        char   *p, *q;
00038        size_t l;
00039 
00040               p=config_localfilename("esmtproutes.dat");
00041 
00042               dbobj_init(&d);
00043               if (dbobj_open(&d, p, "R"))
00044               {
00045                      free(p);
00046                      return (0);
00047               }
00048               free(p);
00049               p=strcpy(courier_malloc(strlen(domain)+1), domain);
00050               for (q=p; *q; q++)
00051                      *q=tolower(*q);
00052               q=dbobj_fetch(&d, p, strlen(p), &l, "D");
00053               free(p);
00054               dbobj_close(&d);
00055               if (!q)       return (0);
00056               p=courier_malloc(l+1);
00057               memcpy(p, q, l);
00058               p[l]=0;
00059               free(q);
00060               return (p);
00061        }
00062 
00063        while (*p)
00064        {
00065        unsigned i;
00066 
00067               for (i=0; p[i] && p[i] != '\n' && p[i] != '\r' && p[i] != ':';
00068                      ++i)
00069                      ;
00070 
00071               if (p[i] == ':' && (i == 0 ||
00072                      config_domaincmp(domain, p, i) == 0))
00073               {
00074               char *q;
00075 
00076                      p += i;
00077                      ++p;
00078                      for (i=0; p[i] && p[i] != '\n' && p[i] != '\r'; i++)
00079                             ;
00080 
00081                      while (i && isspace((int)(unsigned char)p[i-1]))
00082                             --i;
00083                      while (i && isspace((int)(unsigned char)*p))
00084                      {
00085                             ++p;
00086                             --i;
00087                      }
00088                      if (i == 0)
00089                      {
00090                             free(buf);
00091                             return (0);
00092                      }
00093 
00094                      q=courier_malloc(i+1);
00095                      memcpy(q, p, i);
00096                      q[i]=0;
00097                      free(buf);
00098                      return (q);
00099               }
00100 
00101               while (p[i])
00102               {
00103                      if (p[i] == '\n' || p[i] == '\r')
00104                      {
00105                             ++i;
00106                             break;
00107                      }
00108                      ++i;
00109               }
00110               p += i;
00111        }
00112 
00113        free(buf);
00114        return (0);
00115 }
00116 
00117 char *smtproutes(const char *domain, int *flags)
00118 {
00119        char *p, *q, *r;
00120 
00121        *flags=0;
00122 
00123        p=fetch_smtproutes(domain);
00124 
00125        if (!p)
00126               return (0);
00127 
00128        if ((q=strrchr(p, '/')) != 0)
00129        {
00130               for (*q++=0; (q=strtok(q, ", \r\t\n")) != NULL; q=0)
00131               {
00132                      char *r;
00133 
00134                      for (r=q; *r; r++)
00135                             *r=(int)(unsigned char)toupper(*r);
00136 
00137                      if (strcmp(q, "SECURITY=STARTTLS") == 0)
00138                             *flags |= ROUTE_STARTTLS;
00139 
00140                      if (strcmp(q, "SECURITY=NONE") == 0)
00141                             *flags |= ROUTE_NOSECURITY;
00142 
00143               }
00144        }
00145 
00146        /* Trim trailing spaces */
00147 
00148        for (q=r=p; *q; q++)
00149        {
00150               if (!isspace((int)(unsigned char)*q))
00151               {
00152                      r=q+1;
00153               }
00154        }
00155        *r=0;
00156 
00157        if (!*p)
00158        {
00159               free(p);
00160               p=0;
00161        }
00162        return (p);
00163 }