|
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) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.unix.bsd/44173c248e3b.html, оценка из 5, голосов 10
|