aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/page/util.c
blob: 74dd9bfefdaa56ac52c54ac29c871ec407d88783 (plain)
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <u.h>
#include <libc.h>
#include <draw.h>
#include <thread.h>
#include <bio.h>
#include <cursor.h>
#include "page.h"

void*
emalloc(int sz)
{
	void *v;
	v = malloc(sz);
	if(v == nil) {
		fprint(2, "out of memory allocating %d\n", sz);
		wexits("mem");
	}
	memset(v, 0, sz);
	return v;
}

void*
erealloc(void *v, int sz)
{
	v = realloc(v, sz);
	if(v == nil) {
		fprint(2, "out of memory allocating %d\n", sz);
		wexits("mem");
	}
	return v;
}

char*
estrdup(char *s)
{
	char *t;
	if((t = strdup(s)) == nil) {
		fprint(2, "out of memory in strdup(%.10s)\n", s);
		wexits("mem");
	}
	return t;
}

/*
 * spool standard input to /tmp.
 * we've already read the initial in bytes into ibuf.
 */
int
spooltodisk(uchar *ibuf, int in, char **name)
{
	uchar buf[8192];
	int fd, n;
	char temp[40];

	strcpy(temp, "/tmp/pagespoolXXXXXXXXX");
	fd = opentemp(temp, ORDWR|ORCLOSE);
	if(name)
		*name = estrdup(temp);

	if(write(fd, ibuf, in) != in){
		fprint(2, "error writing temporary file\n");
		wexits("write temp");
	}

	while((n = read(stdinfd, buf, sizeof buf)) > 0){
		if(write(fd, buf, n) != n){
			fprint(2, "error writing temporary file\n");
			wexits("write temp0");
		}
	}
	seek(fd, 0, 0);
	return fd;
}

typedef struct StdinArg StdinArg;

struct StdinArg {
	Channel *cp;
	uchar	*ibuf;
	int	in;
};

/*
 * spool standard input into a pipe.
 * we've already ready the first in bytes into ibuf
 */
static void
_stdinpipe(void *a)
{
	uchar buf[8192];
	StdinArg *arg;
	int p[2];
	int n;

	arg = a;

	if(pipe(p) < 0){
		fprint(2, "pipe fails: %r\n");	
		wexits("pipe");
	}

	send(arg->cp, &p[0]);

	write(p[1], arg->ibuf, arg->in);
	while((n = read(stdinfd, buf, sizeof buf)) > 0)
		write(p[1], buf, n);
	
	close(p[1]);
	threadexits(0);
}

int
stdinpipe(uchar *ibuf, int in) {
	StdinArg arg;
	int fd;

	arg.ibuf = ibuf;
	arg.in = in;
	arg.cp = chancreate(sizeof(int), 0);
	proccreate(_stdinpipe, &arg, mainstacksize);
	recv(arg.cp, &fd);
	chanfree(arg.cp);

	return fd;
}