version 1.12, 2003/07/31 15:50:16 |
version 1.12.8.1, 2005/09/04 18:39:52 |
|
|
/* |
/* |
|
* Copyright (c) 2005 Anil Madhavapeddy. All rights reserved. |
* Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. |
* Copyright (c) 1995,1999 Theo de Raadt. All rights reserved. |
* All rights reserved. |
* All rights reserved. |
* |
* |
|
|
/* |
/* |
* ensure all of data on socket comes through. f==read || f==vwrite |
* ensure all of data on socket comes through. f==read || f==vwrite |
*/ |
*/ |
ssize_t |
size_t |
atomicio(f, fd, _s, n) |
atomicio(f, fd, _s, n) |
ssize_t (*f) (int, void *, size_t); |
ssize_t (*f) (int, void *, size_t); |
int fd; |
int fd; |
|
|
size_t n; |
size_t n; |
{ |
{ |
char *s = _s; |
char *s = _s; |
ssize_t res, pos = 0; |
size_t pos = 0; |
|
ssize_t res; |
|
|
while (n > pos) { |
while (n > pos) { |
res = (f) (fd, s + pos, n - pos); |
res = (f) (fd, s + pos, n - pos); |
|
|
case -1: |
case -1: |
if (errno == EINTR || errno == EAGAIN) |
if (errno == EINTR || errno == EAGAIN) |
continue; |
continue; |
|
return 0; |
case 0: |
case 0: |
return (res); |
errno = EPIPE; |
|
return pos; |
default: |
default: |
pos += res; |
pos += (u_int)res; |
} |
} |
} |
} |
return (pos); |
return (pos); |