masqmail-0.2

annotate src/libident/id_parse.c @ 3:8c55886cacd8

man pages will be maintained in troff now
author meillo@marmaro.de
date Fri, 26 Sep 2008 21:40:10 +0200
parents
children 26e34ae9a3e3
rev   line source
meillo@0 1 /*
meillo@0 2 ** id_parse.c Receive and parse a reply from an IDENT server
meillo@0 3 **
meillo@0 4 ** Author: Peter Eriksson <pen@lysator.liu.se>
meillo@0 5 ** Fiddling: Pär Emanuelsson <pell@lysator.liu.se>
meillo@0 6 */
meillo@0 7
meillo@0 8 #ifdef NeXT3
meillo@0 9 # include <libc.h>
meillo@0 10 #endif
meillo@0 11
meillo@0 12 #include <stdio.h>
meillo@0 13 #include <string.h>
meillo@0 14 #include <errno.h>
meillo@0 15 #include <ctype.h>
meillo@0 16
meillo@0 17 #ifdef HAVE_ANSIHEADERS
meillo@0 18 # include <stdlib.h>
meillo@0 19 # include <string.h>
meillo@0 20 # include <unistd.h>
meillo@0 21 #endif
meillo@0 22
meillo@0 23 #include <sys/types.h>
meillo@0 24 #include <sys/wait.h>
meillo@0 25 #include <sys/time.h>
meillo@0 26
meillo@0 27 #ifdef _AIX
meillo@0 28 # include <sys/select.h>
meillo@0 29 #endif
meillo@0 30
meillo@0 31 #ifdef _AIX
meillo@0 32 # include <sys/select.h>
meillo@0 33 #endif
meillo@0 34 #ifdef VMS
meillo@0 35 # include <sys/socket.h> /* for fd_set */
meillo@0 36 #endif
meillo@0 37 #define IN_LIBIDENT_SRC
meillo@0 38 #include "ident.h"
meillo@0 39
meillo@0 40
meillo@0 41 /*
meillo@0 42 int id_parse __P7(ident_t *, id,
meillo@0 43 struct timeval *, timeout,
meillo@0 44 int *, lport,
meillo@0 45 int *, fport,
meillo@0 46 char **, identifier,
meillo@0 47 char **, opsys,
meillo@0 48 char **, charset)
meillo@0 49 */
meillo@0 50
meillo@0 51 int id_parse __P(( ident_t *id,
meillo@0 52 __STRUCT_TIMEVAL_P timeout,
meillo@0 53 int *lport,
meillo@0 54 int *fport,
meillo@0 55 char **identifier,
meillo@0 56 char **opsys,
meillo@0 57 char **charset))
meillo@0 58 {
meillo@0 59 char c, *cp, *tmp_charset;
meillo@0 60 fd_set rs;
meillo@0 61 int pos, res=0, lp, fp;
meillo@0 62
meillo@0 63 errno = 0;
meillo@0 64
meillo@0 65 tmp_charset = 0;
meillo@0 66
meillo@0 67 if (!id)
meillo@0 68 return -1;
meillo@0 69 if (lport)
meillo@0 70 *lport = 0;
meillo@0 71 if (fport)
meillo@0 72 *fport = 0;
meillo@0 73 if (identifier)
meillo@0 74 *identifier = 0;
meillo@0 75 if (opsys)
meillo@0 76 *opsys = 0;
meillo@0 77 if (charset)
meillo@0 78 *charset = 0;
meillo@0 79
meillo@0 80 pos = strlen(id->buf);
meillo@0 81
meillo@0 82 if (timeout)
meillo@0 83 {
meillo@0 84 FD_ZERO(&rs);
meillo@0 85 FD_SET(id->fd, &rs);
meillo@0 86
meillo@0 87 #ifdef __hpux
meillo@0 88 if ((res = select(FD_SETSIZE, (int *) &rs, (int *)0, (int *)0, timeout)) < 0)
meillo@0 89 #else
meillo@0 90 if ((res = select(FD_SETSIZE, &rs, (fd_set *)0, (fd_set *)0, timeout)) < 0)
meillo@0 91 #endif
meillo@0 92 return -1;
meillo@0 93
meillo@0 94 if (res == 0)
meillo@0 95 {
meillo@0 96 errno = ETIMEDOUT;
meillo@0 97 return -1;
meillo@0 98 }
meillo@0 99 }
meillo@0 100
meillo@0 101 /* Every octal value is allowed except 0, \n and \r */
meillo@0 102 while (pos < sizeof(id->buf) &&
meillo@0 103 (res = read(id->fd, id->buf + pos, 1)) == 1 &&
meillo@0 104 id->buf[pos] != '\n' && id->buf[pos] != '\r')
meillo@0 105 pos++;
meillo@0 106
meillo@0 107 if (res < 0)
meillo@0 108 return -1;
meillo@0 109
meillo@0 110 if (res == 0)
meillo@0 111 {
meillo@0 112 errno = ENOTCONN;
meillo@0 113 return -1;
meillo@0 114 }
meillo@0 115
meillo@0 116 if (id->buf[pos] != '\n' && id->buf[pos] != '\r')
meillo@0 117 return 0; /* Not properly terminated string */
meillo@0 118
meillo@0 119 id->buf[pos++] = '\0';
meillo@0 120
meillo@0 121 /*
meillo@0 122 ** Get first field (<lport> , <fport>)
meillo@0 123 */
meillo@0 124 cp = id_strtok(id->buf, ":", &c);
meillo@0 125 if (!cp)
meillo@0 126 return -2;
meillo@0 127
meillo@0 128 if (sscanf(cp, " %d , %d", &lp, &fp) != 2)
meillo@0 129 {
meillo@0 130 if (identifier)
meillo@0 131 {
meillo@0 132 *identifier = id_strdup(cp);
meillo@0 133 if (*identifier == NULL)
meillo@0 134 return -4;
meillo@0 135 }
meillo@0 136 return -2;
meillo@0 137 }
meillo@0 138
meillo@0 139 if (lport)
meillo@0 140 *lport = lp;
meillo@0 141 if (fport)
meillo@0 142 *fport = fp;
meillo@0 143
meillo@0 144 /*
meillo@0 145 ** Get second field (USERID or ERROR)
meillo@0 146 */
meillo@0 147 cp = id_strtok((char *)0, ":", &c);
meillo@0 148 if (!cp)
meillo@0 149 return -2;
meillo@0 150
meillo@0 151 if (strcmp(cp, "ERROR") == 0)
meillo@0 152 {
meillo@0 153 cp = id_strtok((char *)0, "\n\r", &c);
meillo@0 154 if (!cp)
meillo@0 155 return -2;
meillo@0 156
meillo@0 157 if (identifier)
meillo@0 158 {
meillo@0 159 *identifier = id_strdup(cp);
meillo@0 160 if (*identifier == NULL)
meillo@0 161 return -4;
meillo@0 162 }
meillo@0 163
meillo@0 164 return 2;
meillo@0 165 }
meillo@0 166 else if (strcmp(cp, "USERID") == 0)
meillo@0 167 {
meillo@0 168 /*
meillo@0 169 ** Get first subfield of third field <opsys>
meillo@0 170 */
meillo@0 171 cp = id_strtok((char *) 0, ",:", &c);
meillo@0 172 if (!cp)
meillo@0 173 return -2;
meillo@0 174
meillo@0 175 if (opsys)
meillo@0 176 {
meillo@0 177 *opsys = id_strdup(cp);
meillo@0 178 if (*opsys == NULL)
meillo@0 179 return -4;
meillo@0 180 }
meillo@0 181
meillo@0 182 /*
meillo@0 183 ** We have a second subfield (<charset>)
meillo@0 184 */
meillo@0 185 if (c == ',')
meillo@0 186 {
meillo@0 187 cp = id_strtok((char *)0, ":", &c);
meillo@0 188 if (!cp)
meillo@0 189 return -2;
meillo@0 190
meillo@0 191 tmp_charset = cp;
meillo@0 192 if (charset)
meillo@0 193 {
meillo@0 194 *charset = id_strdup(cp);
meillo@0 195 if (*charset == NULL)
meillo@0 196 return -4;
meillo@0 197 }
meillo@0 198
meillo@0 199 /*
meillo@0 200 ** We have even more subfields - ignore them
meillo@0 201 */
meillo@0 202 if (c == ',')
meillo@0 203 id_strtok((char *)0, ":", &c);
meillo@0 204 }
meillo@0 205
meillo@0 206 if (tmp_charset && strcmp(tmp_charset, "OCTET") == 0)
meillo@0 207 cp = id_strtok((char *)0, (char *)0, &c);
meillo@0 208 else
meillo@0 209 cp = id_strtok((char *)0, "\n\r", &c);
meillo@0 210
meillo@0 211 if (identifier)
meillo@0 212 {
meillo@0 213 *identifier = id_strdup(cp);
meillo@0 214 if (*identifier == NULL)
meillo@0 215 return -4;
meillo@0 216 }
meillo@0 217 return 1;
meillo@0 218 }
meillo@0 219 else
meillo@0 220 {
meillo@0 221 if (identifier)
meillo@0 222 {
meillo@0 223 *identifier = id_strdup(cp);
meillo@0 224 if (*identifier == NULL)
meillo@0 225 return -4;
meillo@0 226 }
meillo@0 227 return -3;
meillo@0 228 }
meillo@0 229 }