1+ ##//cspell:ignore strprintf
2+
3+ ; _ = config("resource_debug" ,0)
4+ ; define inputname ( ) = custom("inputname" )
5+ ; define dirname (path ) = custom("dirname",path )
6+ ; p = strcat(dirname(inputname()),"/pfe+conf.cal" )
7+ ;read $p
8+
9+ ; NULL = null()
10+ ; TRUE = 1
11+ ; FALSE = 0
12+
13+ ; err = 2
14+ ; out = 1
15+ ; in = 0
16+
17+ ; LEAKS = eval(getenv("leaks" )||"" )
18+
19+ ; WRITE = eval(getenv("write" )||"1" )
20+ ; WAIT = eval(getenv("wait" )||"" )
21+
22+ ; v = eval(getenv("verbose" )||"" )
23+
24+ ; di = pipe() ##// dn in
25+ ; uo = pipe() ##// up out
26+ ; ue = pipe() ##// up err
27+
28+ ;if( pid = fork()){
29+ ; e = close ( di[ in ] )
30+ ; e = close ( ue[ out ] )
31+ ; e = close ( uo[ out ] )
32+ /*
33+ ; wtl = list ( di[ out ] )
34+ ; s = fds (null(),wtl)
35+ ; print "parent wtl bef. wt:":wtl
36+ /**/##end
37+ ; if( v) print "parent writing to child"
38+ ;if( WRITE
39+ ) c = wt ( di[ out ] ,"parent to child")
40+ ; e = close ( di[ out ] )
41+ /*
42+ ; rcl = list ( uo[ in ]
43+ , ue[ in ] )
44+ ; s = fds \
45+ ( rcl )
46+ ; print "parent rcl aft. wt bef. sleep:":rcl
47+
48+ ; s = 1
49+ ; sleep ( s)
50+
51+ ; rcl = list ( uo[ in ]
52+ , ue[ in ] )
53+ ; s = fds \
54+ ( rcl )
55+ ; print "parent rcl bef. rd:":rcl
56+ /**/##end
57+ ; rbl = list ( uo[ in ]
58+ , ue[ in ] ) ##// read base list
59+ ; s = -1
60+ ;while( rbz = size \
61+ ( rbl ) ){
62+ /**/
63+ ;if( v && s == -1
64+ ) s\
65+ = WAIT
66+ ;else if( s){
67+ ; if( v) printf( "parent ------ sleep %d; read base size %d\n"
68+ , s
69+ , rbz )
70+ ; sleep ( s ) ;}
71+ /**/##end
72+ ; rcl\
73+ = rbl ##// read check list
74+ ; exl = list ( uo[ in ]
75+ , ue[ in ] )
76+ ; if( v) print "parent before select"
77+ (! WAIT
78+ ?"" :strprintf ( " waiting %f"
79+ , WAIT/2))
80+ /**/
81+ ; fdc\
82+ = fds\
83+ ( & rcl,! WAIT
84+ ? NULL: WAIT/2)
85+ /*##else
86+ ; fdc\
87+ = fds\
88+ ( rcl
89+ , NULL
90+ , exl, WAIT)
91+ /**/##end
92+ ;if(0 < fdc ){
93+ ; rcz = size \
94+ ( rcl ) ;
95+ ; if( v) print "parent select read size"\
96+ : ":" rcz ;
97+ ;for( rcs = 0
98+ ; rcs
99+ < rcz
100+ ; rcs++){
101+ ; if( v) print "parent select read "\
102+ : rcs \
103+ :":" \
104+ : rcl \
105+ [ rcs] ;
106+ ; rcd = rd \
107+ ( rcl
108+ [ rcs])
109+ ;if( rcl
110+ [ rcs]
111+ == uo[ in ]
112+ )if( rcd!=NULL) print ##"out:\n"
113+ : rcd:
114+ else{ delete \
115+ ( rbl
116+ , search
117+ (rbl, uo[ in ]))
118+ ; if( v) print "parent read eof - child out"
119+ ;}
120+ ;if( rcl
121+ [ rcs]
122+ == ue[ in ]
123+ )if( rcd!=NULL) print ##"err:\n"
124+ : rcd:
125+ else{ delete \
126+ ( rbl
127+ , search
128+ (rbl, ue[ in ]))
129+ ; if( v) print "parent read eof - child err"
130+ ;}
131+ ;}
132+ /*
133+ ; exz = size \
134+ ( exl ) ;
135+ ; print "parent select exception size"\
136+ : ":" exz ;
137+ ;for( exs = 0
138+ ; exs
139+ < exz
140+ ; exs++){
141+ ; print "parent select exception "\
142+ : exs \
143+ :":" \
144+ : exl \
145+ [ exs] ;
146+ ;}
147+ /**/##end
148+ ;}
149+ ;}
150+ ; stt = assoc()
151+ ; w = wait4(pid,& stt)
152+ ;if( v && stt["exited" ] ){
153+ ; print "parent: child exited with status"
154+ :" ": stt["exitstatus"];}
155+ ;if( v && stt["signaled" ] ){
156+ ; print "parent: child signaled by "
157+ : stt["termsig" ]
158+ : ( stt["coredump" ]
159+ ? " (with dump)"
160+ : " (no dump)" ) ;}
161+ ;if( v && stt["stopped" ] ){
162+ ; print "parent: child stopped by "
163+ : stt["stopsig" ] ;}
164+ ;print "stt" \
165+ : (! stt["exited" ]
166+ ?0: stt["exitstatus"] )
167+ + (! stt["stopped" ]
168+ ?0: 127+stt["stopsig" ] )
169+ + (! stt["signaled" ]
170+ ?0: 127+stt["termsig" ] )
171+ ;}\
172+ else{
173+ ; e = close ( uo[ in ] )
174+ ; e = close ( ue[ in ] )
175+ ; e = close ( di[ out ] )
176+
177+ ; scpt\
178+ = strprintf("read; echo \"outA:$REPLY\"; echo 'errA' >&2;%s echo 'outZ'; exec >&-; echo 'errZ' >&2; exec 2>&-;exit 2"
179+ , ! WAIT ? "" : strprintf(" sleep %d;"
180+ , floor ( WAIT*2.5) ))
181+ ; if( v) print scpt
182+
183+ ; args = list\
184+ ( "bash"
185+ , "-c")
186+ ; append ( args, scpt)
187+
188+ ; d = dup2 ( di[ in ]
189+ , in )
190+ ; d = dup2 ( uo[ out ]
191+ , out )
192+ ; d = dup2 ( ue[ out ]
193+ , err )
194+
195+ ; e = execvp ( args[0]
196+ , args)
197+
198+ ;}
199+
200+ ;if( LEAKS ){
201+ ; print getpid()
202+ ; rd ( in )
203+ ;}
0 commit comments