|
|
1.1 root 1: /* picture.c - exec printing of external attributes */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/dsap/common/RCS/picture.c,v 7.0 89/11/23 21:44:21 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/dsap/common/RCS/picture.c,v 7.0 89/11/23 21:44:21 mrose Rel $
9: *
10: *
11: * $Log: picture.c,v $
12: * Revision 7.0 89/11/23 21:44:21 mrose
13: * Release 6.0
14: *
15: */
16:
17: /*
18: * NOTICE
19: *
20: * Acquisition, use, and distribution of this module and related
21: * materials are subject to the restrictions of a license agreement.
22: * Consult the Preface in the User's Manual for the full terms of
23: * this agreement.
24: *
25: */
26:
27:
28: /* LINTLIBRARY */
29:
30: #include <signal.h>
31: #include "quipu/util.h"
32: #include "quipu/photo.h"
33: #include "quipu/attr.h"
34: #include "psap.h"
35: #include <errno.h>
36: #ifdef BSD42
37: #include <sys/wait.h>
38: #endif
39:
40: static int childpid = 0;
41:
42: char * show_picture (picture,picture_process,len)
43: char *picture;
44: char *picture_process;
45: int len;
46: {
47: int ret;
48: int pd[2];
49: int pd2[2];
50: char *decode_t4();
51: static char buffer [BUFLEN];
52: char * cp;
53: char * argv[NVEC];
54:
55: hide_picture ();
56:
57: if (*picture == '\0')
58: return ("(No data to pass !)");
59: if (picture_process == NULLCP)
60: return ("(No external process defined !)");
61:
62: (void) sstr2arg (picture_process, NVEC, argv, " \t");
63:
64: /* get next two file descriptors used for data xfer */
65: ret = pipe(pd);
66: if (ret == -1)
67: return ("ERROR: could not create pipe");
68:
69: ret = pipe(pd2);
70: if (ret == -1) {
71: (void) close (pd[1]);
72: (void) close (pd[0]);
73: return ("ERROR: could not create 2nd pipe");
74: }
75:
76:
77: /* generate one parent and one child process */
78: if ((childpid = fork()) == -1) {
79: (void) close (pd[1]);
80: (void) close (pd[0]);
81: (void) close (pd2[1]);
82: (void) close (pd2[0]);
83: return ("ERROR: could not fork");
84: }
85:
86: if (childpid != 0) {
87:
88: /* in parent process */
89: (void) close (pd[0]);
90: (void) close (pd2[1]);
91:
92: if (write (pd[1], picture, len) != len) {
93: (void) close (pd[1]);
94: (void) close (pd2[0]);
95: return("ERROR: length error");
96: }
97:
98: (void) close (pd[1]);
99:
100: for (cp = buffer, len = BUFLEN - 1; len > 0;) {
101: if ((ret = read (pd2[0], cp, len)) <= 0)
102: break;
103: cp += ret;
104: len -= ret;
105: }
106: if (cp > buffer) {
107: if (*--cp != '\n')
108: cp++;
109: *cp = NULL;
110: }
111: else
112: (void) sprintf (buffer, "%s invoked", argv[0]);
113:
114: (void) close (pd2[0]);
115: if ( ret < 0 )
116: return ("ERROR: read error");
117:
118: return (buffer);
119:
120: }
121:
122: /* you're in child process */
123: if (dup2(pd[0], 0) == -1)
124: _exit (-1);
125: (void) close (pd[0]);
126: (void) close (pd[1]);
127:
128: if (dup2(pd2[1], 1) == -1)
129: _exit (-1);
130: (void) close (pd2[0]);
131: (void) close (pd2[1]);
132:
133: execv (argv[0],argv);
134:
135: while (read (0, buffer, sizeof buffer) > 0)
136: continue;
137: (void) printf ("ERROR: can't execute '%s'",argv[0]);
138:
139: (void) fflush (stdout);
140: /* safety catch */
141: _exit (-1);
142: /* NOTREACHED */
143: }
144:
145:
146: exec_print (ps,av,proc)
147: PS ps;
148: AttributeValue av;
149: char * proc;
150: {
151: char * ptr;
152: PS sps;
153: PE pe, grab_pe();
154:
155: (void) ps_flush (ps);
156:
157: if ((sps = ps_alloc (str_open)) == NULLPS)
158: return;
159: if (str_setup (sps,NULLCP,LINESIZE,0) == NOTOK) {
160: ps_free (sps);
161: return;
162: }
163:
164: pe = grab_pe (av);
165: (void) pe2ps (sps,pe);
166:
167: ptr = show_picture (sps->ps_base,proc,pe->pe_len);
168: ps_print (ps,ptr);
169:
170: pe_free (pe);
171: ps_free (sps);
172:
173: }
174:
175:
176: hide_picture ()
177: {
178: int pid;
179: #ifndef BSD42
180: int status;
181: #else
182: union wait status;
183: #endif
184:
185: if (childpid > 0) {
186: (void) kill (childpid, SIGTERM);
187: while ((pid = wait (&status)) != NOTOK && childpid != pid)
188: continue;
189:
190: childpid = 0;
191: }
192: }
193:
194: picture_print (ps,pe,format)
195: PS ps;
196: PE pe;
197: int format;
198: {
199: if (format != READOUT)
200: pe_print (ps,pe,format);
201: else
202: ps_print (ps,"(No display process defined)");
203: }
204:
205: quipu_pe_cmp();
206:
207: photo_syntax ()
208: {
209: (void) add_attribute_syntax ("photo",
210: (IFP)pe_cpy, NULLIFP,
211: NULLIFP, picture_print,
212: (IFP)pe_cpy, quipu_pe_cmp,
213: pe_free, NULLCP,
214: NULLIFP, TRUE );
215:
216: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.