File: streamutil.c

package info (click to toggle)
criu 4.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,500 kB
  • sloc: ansic: 139,280; python: 7,484; sh: 3,824; java: 2,799; makefile: 2,659; asm: 1,137; perl: 206; xml: 117; exp: 45
file content (75 lines) | stat: -rw-r--r-- 1,213 bytes parent folder | download | duplicates (3)
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
74
75
#include <errno.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>

#include "zdtmtst.h"

int set_nonblock(int fd, int on)
{
	int flag;

	flag = fcntl(fd, F_GETFL, 0);

	if (flag < 0)
		return flag;

	if (on)
		flag |= O_NONBLOCK;
	else
		flag &= ~O_NONBLOCK;

	return fcntl(fd, F_SETFL, flag);
}

int pipe_in2out(int infd, int outfd, uint8_t *buffer, int length)
{
	uint8_t *buf;
	int rlen, wlen;

	while (1) {
		rlen = read(infd, buffer, length);
		if (rlen <= 0)
			return rlen;

		/* don't go reading until we're done with writing */
		for (buf = buffer; rlen > 0; buf += wlen, rlen -= wlen) {
			wlen = write(outfd, buf, rlen);
			if (wlen < 0)
				return wlen;
		}
	}
}

int read_data(int fd, unsigned char *buf, int size)
{
	int cur = 0;
	int ret;
	while (cur != size) {
		ret = read(fd, buf + cur, size - cur);
		if (ret <= 0) {
			pr_perror("read(%d) = %d", size - cur, ret);
			return -1;
		}
		cur += ret;
	}

	return 0;
}

int write_data(int fd, const unsigned char *buf, int size)
{
	int cur = 0;
	int ret;

	while (cur != size) {
		ret = write(fd, buf + cur, size - cur);
		if (ret <= 0) {
			pr_perror("write(%d) = %d", size - cur, ret);
			return -1;
		}
		cur += ret;
	}

	return 0;
}