Mercurial > masqmail
diff src/libident/id_parse.c @ 0:08114f7dcc23 0.2.21
this is masqmail-0.2.21 from oliver kurth
author | meillo@marmaro.de |
---|---|
date | Fri, 26 Sep 2008 17:05:23 +0200 |
parents | |
children | 26e34ae9a3e3 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/libident/id_parse.c Fri Sep 26 17:05:23 2008 +0200 @@ -0,0 +1,229 @@ +/* +** id_parse.c Receive and parse a reply from an IDENT server +** +** Author: Peter Eriksson <pen@lysator.liu.se> +** Fiddling: Pär Emanuelsson <pell@lysator.liu.se> +*/ + +#ifdef NeXT3 +# include <libc.h> +#endif + +#include <stdio.h> +#include <string.h> +#include <errno.h> +#include <ctype.h> + +#ifdef HAVE_ANSIHEADERS +# include <stdlib.h> +# include <string.h> +# include <unistd.h> +#endif + +#include <sys/types.h> +#include <sys/wait.h> +#include <sys/time.h> + +#ifdef _AIX +# include <sys/select.h> +#endif + +#ifdef _AIX +# include <sys/select.h> +#endif +#ifdef VMS +# include <sys/socket.h> /* for fd_set */ +#endif +#define IN_LIBIDENT_SRC +#include "ident.h" + + +/* +int id_parse __P7(ident_t *, id, + struct timeval *, timeout, + int *, lport, + int *, fport, + char **, identifier, + char **, opsys, + char **, charset) +*/ + +int id_parse __P(( ident_t *id, + __STRUCT_TIMEVAL_P timeout, + int *lport, + int *fport, + char **identifier, + char **opsys, + char **charset)) +{ + char c, *cp, *tmp_charset; + fd_set rs; + int pos, res=0, lp, fp; + + errno = 0; + + tmp_charset = 0; + + if (!id) + return -1; + if (lport) + *lport = 0; + if (fport) + *fport = 0; + if (identifier) + *identifier = 0; + if (opsys) + *opsys = 0; + if (charset) + *charset = 0; + + pos = strlen(id->buf); + + if (timeout) + { + FD_ZERO(&rs); + FD_SET(id->fd, &rs); + +#ifdef __hpux + if ((res = select(FD_SETSIZE, (int *) &rs, (int *)0, (int *)0, timeout)) < 0) +#else + if ((res = select(FD_SETSIZE, &rs, (fd_set *)0, (fd_set *)0, timeout)) < 0) +#endif + return -1; + + if (res == 0) + { + errno = ETIMEDOUT; + return -1; + } + } + + /* Every octal value is allowed except 0, \n and \r */ + while (pos < sizeof(id->buf) && + (res = read(id->fd, id->buf + pos, 1)) == 1 && + id->buf[pos] != '\n' && id->buf[pos] != '\r') + pos++; + + if (res < 0) + return -1; + + if (res == 0) + { + errno = ENOTCONN; + return -1; + } + + if (id->buf[pos] != '\n' && id->buf[pos] != '\r') + return 0; /* Not properly terminated string */ + + id->buf[pos++] = '\0'; + + /* + ** Get first field (<lport> , <fport>) + */ + cp = id_strtok(id->buf, ":", &c); + if (!cp) + return -2; + + if (sscanf(cp, " %d , %d", &lp, &fp) != 2) + { + if (identifier) + { + *identifier = id_strdup(cp); + if (*identifier == NULL) + return -4; + } + return -2; + } + + if (lport) + *lport = lp; + if (fport) + *fport = fp; + + /* + ** Get second field (USERID or ERROR) + */ + cp = id_strtok((char *)0, ":", &c); + if (!cp) + return -2; + + if (strcmp(cp, "ERROR") == 0) + { + cp = id_strtok((char *)0, "\n\r", &c); + if (!cp) + return -2; + + if (identifier) + { + *identifier = id_strdup(cp); + if (*identifier == NULL) + return -4; + } + + return 2; + } + else if (strcmp(cp, "USERID") == 0) + { + /* + ** Get first subfield of third field <opsys> + */ + cp = id_strtok((char *) 0, ",:", &c); + if (!cp) + return -2; + + if (opsys) + { + *opsys = id_strdup(cp); + if (*opsys == NULL) + return -4; + } + + /* + ** We have a second subfield (<charset>) + */ + if (c == ',') + { + cp = id_strtok((char *)0, ":", &c); + if (!cp) + return -2; + + tmp_charset = cp; + if (charset) + { + *charset = id_strdup(cp); + if (*charset == NULL) + return -4; + } + + /* + ** We have even more subfields - ignore them + */ + if (c == ',') + id_strtok((char *)0, ":", &c); + } + + if (tmp_charset && strcmp(tmp_charset, "OCTET") == 0) + cp = id_strtok((char *)0, (char *)0, &c); + else + cp = id_strtok((char *)0, "\n\r", &c); + + if (identifier) + { + *identifier = id_strdup(cp); + if (*identifier == NULL) + return -4; + } + return 1; + } + else + { + if (identifier) + { + *identifier = id_strdup(cp); + if (*identifier == NULL) + return -4; + } + return -3; + } +}