-
Notifications
You must be signed in to change notification settings - Fork 0
/
toolutils.cc
73 lines (67 loc) · 1.6 KB
/
toolutils.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include <sys/socket.h>
#include <netinet/in.h> //sockaddr_in
#include <arpa/inet.h> //inet_pon
#include <unistd.h> //fork,read,write
#include <string.h> //strlen
#include <stdlib.h> //exit(0)
#include <errno.h>
#include "toolutils.h"
ssize_t reandn(int fd, void* vptr, size_t n) {
ssize_t nread;
size_t nleft = n;
char *ptr = vptr;
while (nleft > 0) {
if ( (nread = read(fd, ptr, nleft)) < 0) {
if (errno == EINTR)
nread = 0;
else
return -1;
}
else if (nread == 0) {
break; //EOF
}
nleft -= nread;
ptr += nread;
}
return (n - nleft);
}
ssize_t readline(int fd, void* vptr, size_t maxlen) {
ssize_t n, rc;
char c, *ptr = vptr;
for (n = 1; n < maxlen; ++n) {
if ( (rc = read(fd, &c, 1)) == 1) {
*ptr++ = c;
if (c == '\n')
break;
}
else if (rc == 0) {
*ptr = 0;
return (n-1);
}
else {
if (errno == EINTR) {
--n;
continue;
}
return -1;
}
}
*ptr = 0;
return n;
}
ssize_t writen(int fd, void const* vptr, size_t n) {
ssize_t nwritten;
size_t nleft = n;
char const* ptr = vptr;
while (nleft > n) {
if ( (nwritten = write(fd, ptr, nleft)) <= 0 ) {
if (nwritten < 0 && errno == EINTR)
nwritten = 0;
else
return -1;
}
nleft -= nwritten;
ptr += nwritten;
}
return n;
}