Главная страница


ru.unix.bsd

 
 - RU.UNIX.BSD ------------------------------------------------------------------
 From : Valentin Davydov                     2:5020/400     19 Mar 2001  19:38:58
 To : All
 Subject : Re: Для чего в mail.local функция parseaddr()?
 -------------------------------------------------------------------------------- 
 
 >   From: "Andrew L. Davydov" <davydov@okbmei.msk.su>
 >   Date: Sun, 18 Mar 2001 15:34:32 +0000 (UTC)
 >
 >VD>  Спрашиваю здесь, для чего в mail.local функция parseaddr()?
 >Чтоб адрес парсить, выделить  адрес до @.
 
 $ echo '<user@host>' | ./parseaddr.test
 "user@host"
 $ cat parseaddr.test.c
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sysexits.h>
 
 #define MAILER_DAEMON "MAILER_DAEMON"
 
 char *
 parseaddr(s)
   char *s;
 {
   char *p;
   int len;
 
   if (*s++ != '<')
    return NULL;
 
   p = s;
 
   /* at-domain-list */
   while (*p == '@') {
    p++;
    if (*p == '[') {
       p++;
       while (isascii(*p) &&
              (isalnum(*p) || *p == '.' ||
        *p == '-' || *p == ':'))
        p++;
       if (*p++ != ']')
        return NULL;
    } else {
       while ((isascii(*p) && isalnum(*p)) ||
              strchr(".-_", *p))
        p++;
    }
    if (*p == ',' && p[1] == '@')
       p++;
    else if (*p == ':' && p[1] != '@')
       p++;
    else
       return NULL;
   }
 
   s = p;
 
   /* local-part */
   if (*p == '\"') {
    p++;
    while (*p && *p != '\"') {
       if (*p == '\\') {
        if (!*++p)
           return NULL;
       }
       p++;
    }
    if (!*p++)
       return NULL;
   } else {
    while (*p && *p != '@' && *p != '>') {
       if (*p == '\\') {
        if (!*++p)
           return NULL;
       } else {
       if (*p <= ' ' || (*p & 128) ||
           strchr("<>()[]\\,;:\"", *p))
        return NULL;
       }
       p++;
    }
   }
 
   /* @domain */
   if (*p == '@') {
    p++;
    if (*p == '[') {
       p++;
       while (isascii(*p) &&
              (isalnum(*p) || *p == '.' ||
        *p == '-' || *p == ':'))
        p++;
       if (*p++ != ']')
        return NULL;
    } else {
       while ((isascii(*p) && isalnum(*p)) ||
              strchr(".-_", *p))
        p++;
    }
   }
 
   if (*p++ != '>')
    return NULL;
   if (*p && *p != ' ')
    return NULL;
   len = p - s - 1;
   if (*s == '\0' || len <= 0)
   {
    s = MAILER_DAEMON;
    len = strlen(s);
   }
 
   p = malloc(len + 1);
   if (p == NULL) {
    printf("421 4.3.0 memory exhausted\r\n");
    exit(EX_TEMPFAIL);
   }
 
   strncpy(p, s, len);
   p[len] = '\0';
   return p;
 }
 
 main()
 {
 char buf[4096];
 char *s;
 while(fgets(buf,sizeof(buf),stdin)){
 buf[strlen(buf)-1]=0;
 s=parseaddr(buf);
 if(s==NULL) {printf("NULL\n");}
 else printf("\"%s\"\n",s);
 };
 exit(EX_OK);
 }
 --- ifmail v.2.15dev5
  * Origin: St. Petersburg State University (2:5020/400)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Для чего в mail.local функция parseaddr()?   Valentin Davydov   18 Mar 2001 14:56:44 
 Re: Для чего в mail.local функция parseaddr()?   Andrew L. Davydov   18 Mar 2001 19:34:32 
 Re: Для чего в mail.local функция parseaddr()?   Valentin Davydov   19 Mar 2001 19:38:58 
 Re: Для чего в mail.local функция parseaddr()?   yx   19 Mar 2001 23:50:04 
 Re: Для чего в mail.local функция parseaddr()?   Valentin Davydov   20 Mar 2001 08:20:36 
 Для чего в mail.local функция parseaddr()?   Alex Semenyaka   20 Mar 2001 15:15:08 
 Re: Для чего в mail.local функция parseaddr()?   Vladimir Butenko   21 Mar 2001 05:54:34 
Архивное /ru.unix.bsd/44173c248e3b.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional