Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/cmd/tests/sfio/tmprdwr.c
1810 views
1
/***********************************************************************
2
* *
3
* This software is part of the ast package *
4
* Copyright (c) 1999-2011 AT&T Intellectual Property *
5
* and is licensed under the *
6
* Eclipse Public License, Version 1.0 *
7
* by AT&T Intellectual Property *
8
* *
9
* A copy of the License is available at *
10
* http://www.eclipse.org/org/documents/epl-v10.html *
11
* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12
* *
13
* Information and Software Systems Research *
14
* AT&T Research *
15
* Florham Park NJ *
16
* *
17
* Glenn Fowler <[email protected]> *
18
* *
19
***********************************************************************/
20
#include "sftest.h"
21
22
#define ITER 10
23
#define CNT 2000
24
25
typedef struct _mydisc_s
26
{
27
Sfdisc_t disc;
28
int size; /* remaining size of readable data */
29
int send; /* channel to send size of a read */
30
int recv; /* channel to read amount of data */
31
} Mydisc_t;
32
33
#if __STD_C
34
ssize_t discread(Sfio_t* f, void* buf, size_t n, Sfdisc_t* disc)
35
#else
36
ssize_t discread(f, buf, n, disc)
37
Sfio_t* f;
38
void* buf;
39
size_t n;
40
Sfdisc_t* disc;
41
#endif
42
{
43
Mydisc_t *dc = (Mydisc_t*)disc;
44
int r;
45
46
if(dc->size <= 0)
47
{ if((r = read(dc->recv, &dc->size, sizeof(int))) != sizeof(int) )
48
return 0;
49
50
if(dc->size == 0)
51
return 0;
52
}
53
54
if(n > dc->size)
55
n = dc->size;
56
if((r = read(sffileno(f), buf, n)) <= 0)
57
terror("Bad reading of data from file r=%d n=%d", r, n);
58
/**/TSTDEBUG(("Reader just read %d bytes", r));
59
60
dc->size -= r;
61
62
if((n = write(dc->send, &r, sizeof(int))) != sizeof(int))
63
terror("Sending read size");
64
/**/TSTDEBUG(("Reader just told sender of a %d byte read",r));
65
66
return r;
67
}
68
69
#if __STD_C
70
void writeprocess(int send, int recv, Sfio_t* f)
71
#else
72
void writeprocess(send, recv, f)
73
int send;
74
int recv;
75
Sfio_t* f;
76
#endif
77
{
78
char buf[11*CNT], *bp;
79
int i, s, size, rv;
80
81
for(s = 0, bp = buf; s < CNT; ++s)
82
{ for(i = 0; i < 10; ++i)
83
*bp++ = '0' + i%10;
84
*bp++ = '\0';
85
}
86
87
for(i = 0; i < ITER; i++)
88
{
89
/* write out a buffer of data */
90
if((size = write(sffileno(f), buf, sizeof(buf))) != sizeof(buf))
91
terror("Bad write to file");
92
if(write(send, &size, sizeof(int)) != sizeof(int))
93
terror("Sending output size %d", size);
94
/**/TSTDEBUG(("Writer just wrote %d bytes", size));
95
96
/* now wait until readprocess exhausts the data */
97
while(size > 0)
98
{ if((rv = read(recv, &s, sizeof(int))) != sizeof(int))
99
terror("Reading amount of consumed data, rv=%d", rv);
100
/**/TSTDEBUG(("Writer was told of a %d byte read",s));
101
102
if(s <= 0 || s > size)
103
terror("Reader just told a bad read size %d", s);
104
size -= s;
105
}
106
}
107
108
size = 0;
109
if(write(send, &size, sizeof(int)) != sizeof(int))
110
terror("Sending eof signal");
111
}
112
113
tmain()
114
{
115
Sfio_t *fw, *fr;
116
Mydisc_t disc;
117
int parent[2], child[2];
118
char buf[11];
119
int i, s, rv;
120
121
if(pipe(parent) < 0 || pipe(child) < 0)
122
terror("Making pipes for communications");
123
124
if(!(fw = sfopen(NIL(Sfio_t*), tstfile("sf", 0), "w")) )
125
terror("Creating temp file");
126
127
if(!(fr = sfopen(NIL(Sfio_t*), tstfile("sf", 0), "r")) )
128
terror("Opening temp file to read");
129
130
disc.disc.readf = discread;
131
disc.disc.writef = 0;
132
disc.disc.seekf = 0;
133
disc.disc.exceptf = 0;
134
disc.send = parent[1];
135
disc.recv = child[0];
136
disc.size = 0;
137
sfdisc(fr, &disc.disc);
138
139
switch(fork())
140
{
141
case -1 :
142
terror("fork() failed");
143
case 0 :
144
close(child[0]); close(parent[1]);
145
writeprocess(child[1], parent[0], fw);
146
break;
147
default:
148
close(child[1]); close(parent[0]);
149
for(i = 0, s = 0; i <= ITER*CNT; ++i)
150
{ if((rv = sfread(fr, buf, 11)) != 11)
151
break;
152
s += rv;
153
if(strcmp(buf, "0123456789") != 0)
154
terror("Bad data");
155
for(rv = 0; rv < 11; ++rv)
156
buf[rv] = 1;
157
}
158
if(s != ITER*CNT*11)
159
terror("Only read %d, expected %d", s, ITER*CNT*11);
160
break;
161
}
162
163
texit(0);
164
}
165
166