96 |
{ |
{ |
97 |
struct _gsasl_stream *s = stream_get_owner (stream); |
struct _gsasl_stream *s = stream_get_owner (stream); |
98 |
_auth_lb_destroy (&s->lb); |
_auth_lb_destroy (&s->lb); |
|
s->buffer = NULL; |
|
99 |
} |
} |
100 |
|
|
101 |
static int |
static int |
107 |
size_t len, sz; |
size_t len, sz; |
108 |
char *bufp; |
char *bufp; |
109 |
|
|
110 |
if (_auth_lb_level (&s->lb)) |
if (_auth_lb_level (s->lb)) |
111 |
{ |
{ |
112 |
len = _auth_lb_readline (s->lb, optr, osize-1); |
len = _auth_lb_readline (s->lb, optr, osize-1); |
113 |
optr[len] = 0; |
optr[len] = 0; |
129 |
return errno; |
return errno; |
130 |
} |
} |
131 |
|
|
132 |
rc = _auth_lb_grow (s, buf, sz); |
rc = _auth_lb_grow (s->lb, buf, sz); |
133 |
if (rc) |
if (rc) |
134 |
return rc; |
return rc; |
135 |
|
|
136 |
len = UINT_MAX; /* override the bug in libgsasl */ |
len = UINT_MAX; /* override the bug in libgsasl */ |
137 |
rc = gsasl_decode (s->sess_ctx, s->buffer, s->level, NULL, &len); |
rc = gsasl_decode (s->sess_ctx, |
138 |
|
_auth_lb_data (s->lb), |
139 |
|
_auth_lb_level (s->lb), |
140 |
|
NULL, &len); |
141 |
} |
} |
142 |
while (rc == GSASL_NEEDS_MORE); |
while (rc == GSASL_NEEDS_MORE); |
143 |
|
|
164 |
if (len > osize) |
if (len > osize) |
165 |
{ |
{ |
166 |
memcpy (optr, bufp, osize); |
memcpy (optr, bufp, osize); |
167 |
_auth_lb_drop (s); |
_auth_lb_drop (s->lb); |
168 |
_auth_lb_grow (s, bufp + osize, len - osize); |
_auth_lb_grow (s->lb, bufp + osize, len - osize); |
169 |
len = osize; |
len = osize; |
170 |
} |
} |
171 |
else |
else |
172 |
{ |
{ |
173 |
_auth_lb_drop (s); |
_auth_lb_drop (s->lb); |
174 |
memcpy (optr, bufp, len); |
memcpy (optr, bufp, len); |
175 |
} |
} |
176 |
|
|
183 |
} |
} |
184 |
|
|
185 |
int |
int |
186 |
write_chunk (struct _gsasl_stream *s, char *start, char *end) |
write_chunk (void *data, char *start, char *end) |
187 |
{ |
{ |
188 |
|
struct _gsasl_stream *s = data; |
189 |
size_t chunk_size = end - start + 1; |
size_t chunk_size = end - start + 1; |
190 |
size_t len; |
size_t len; |
191 |
size_t wrsize; |
size_t wrsize; |
227 |
int rc; |
int rc; |
228 |
struct _gsasl_stream *s = stream_get_owner (stream); |
struct _gsasl_stream *s = stream_get_owner (stream); |
229 |
|
|
230 |
rc = _auth_lb_grow (s, iptr, isize); |
rc = _auth_lb_grow (s->lb, iptr, isize); |
231 |
if (rc) |
if (rc) |
232 |
return rc; |
return rc; |
233 |
|
|
234 |
if (s->level > 2) |
return _auth_lb_writelines (s->lb, iptr, isize, offset, |
235 |
{ |
write_chunk, s, nbytes); |
|
char *start, *end; |
|
|
|
|
|
for (start = s->buffer, end = strchr (start, '\n'); |
|
|
end && end < s->buffer + s->level; |
|
|
start = end + 1, end = strchr (start, '\n')) |
|
|
if (end[-1] == '\r') |
|
|
{ |
|
|
int rc = write_chunk (s, start, end); |
|
|
if (rc) |
|
|
return rc; |
|
|
} |
|
|
|
|
|
if (start > s->buffer) |
|
|
{ |
|
|
if (start < s->buffer + s->level) |
|
|
{ |
|
|
int rest = s->buffer + s->level - start + 1; |
|
|
memmove (s->buffer, start, rest); |
|
|
s->level = rest; |
|
|
} |
|
|
else |
|
|
s->level = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
if (nbytes) |
|
|
*nbytes = isize; |
|
|
|
|
|
return 0; |
|
236 |
} |
} |
237 |
|
|
238 |
static int |
static int |
271 |
} |
} |
272 |
|
|
273 |
int |
int |
274 |
_gsasl_get_fd (stream_t stream, int *pfd) |
_gsasl_get_fd (stream_t stream, int *pfd, int *pfd2) |
275 |
{ |
{ |
276 |
struct _gsasl_stream *s = stream_get_owner (stream); |
struct _gsasl_stream *s = stream_get_owner (stream); |
277 |
|
if (pfd2) |
278 |
|
return ENOSYS; |
279 |
*pfd = s->fd; |
*pfd = s->fd; |
280 |
return 0; |
return 0; |
281 |
} |
} |