My Project
Loading...
Searching...
No Matches
pipeLink.cc File Reference
#include "kernel/mod2.h"
#include "reporter/si_signals.h"
#include "tok.h"
#include "ipid.h"
#include "subexpr.h"
#include "links/silink.h"
#include "lists.h"
#include "pipeLink.h"
#include "Singular/feOpt.h"
#include <errno.h>
#include <sys/types.h>

Go to the source code of this file.

Data Structures

struct  pipeInfo

Functions

static BOOLEAN pipeOpen (si_link l, short, leftv)
static BOOLEAN pipeClose (si_link l)
static BOOLEAN pipeKill (si_link l)
static leftv pipeRead1 (si_link l)
static BOOLEAN pipeWrite (si_link l, leftv data)
static const char * slStatusPipe (si_link l, const char *request)
si_link_extension slInitPipeExtension (si_link_extension s)

Variables

EXTERN_VAR BOOLEAN FE_OPT_NO_SHELL_FLAG
EXTERN_VAR si_link pipeLastLink

Data Structure Documentation

◆ pipeInfo

struct pipeInfo

Definition at line 26 of file pipeLink.cc.

Data Fields
FILE * f_read
FILE * f_write
int fd_read
int fd_write
char level
pid_t pid

Function Documentation

◆ pipeClose()

BOOLEAN pipeClose ( si_link l)
static

Definition at line 95 of file pipeLink.cc.

96{
97 pipeInfo *d = (pipeInfo *)l->data;
98 if (d!=NULL)
99 {
100 BOOLEAN unidirectional=TRUE;
101 if ( (d->f_read!=NULL) && (d->f_write!=NULL))
102 unidirectional=FALSE;
103
104 if (d->f_read!=NULL)
105 {
106 fclose(d->f_read);
107 d->f_read=NULL;
110 }
111 if (unidirectional && (d->f_write!=NULL))
112 {
113 fclose(d->f_write);
114 d->f_write=NULL;
116 }
117 if (unidirectional && (d->pid!=0))
118 { kill(d->pid,15); kill(d->pid,9); }
119 }
121 return FALSE;
122}
int BOOLEAN
Definition auxiliary.h:88
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
int l
Definition cfEzgcd.cc:100
#define NULL
Definition omList.c:12

◆ pipeKill()

BOOLEAN pipeKill ( si_link l)
static

Definition at line 125 of file pipeLink.cc.

126{
128 pipeInfo *d = (pipeInfo *)l->data;
129 if (d!=NULL)
130 {
131 omFreeSize((ADDRESS)d,(sizeof *d));
132 }
133 l->data=NULL;
134 return FALSE;
135}
void * ADDRESS
Definition auxiliary.h:120
#define omFreeSize(addr, size)

◆ pipeOpen()

BOOLEAN pipeOpen ( si_link l,
short ,
leftv  )
static

Definition at line 36 of file pipeLink.cc.

37{
38 if (FE_OPT_NO_SHELL_FLAG) {WerrorS("no links allowed");return TRUE;}
39 int cpus = (long) feOptValue(FE_OPT_CPUS);
40 if (cpus<1)
41 {
42 WerrorS("no sub-processes allowed");
43 l->flags=0;
44 return TRUE;
45 }
46 pipeInfo *d=(pipeInfo*)omAlloc0(sizeof(pipeInfo));
47 int pc[2];
48 int cp[2];
49 int err1=pipe(pc);
50 int err2=pipe(cp);
51 if (err1 || err2)
52 {
53 Werror("pipe failed with %d\n",errno);
54 omFreeSize(d,sizeof(*d));
55 l->flags=0;
56 return TRUE;
57 }
58 /* else */
59 pid_t pid=fork();
60 if (pid==0) /*child*/
61 {
62 /* close unnecessary pipe descriptors for a clean environment */
63 si_close(pc[1]); si_close(cp[0]);
64 /* dup pipe read/write to stdin/stdout */
65 si_dup2( pc[0], STDIN_FILENO );
66 si_dup2( cp[1], STDOUT_FILENO );
67 int r=system(l->name);
68 si_close(pc[0]);
69 si_close(cp[1]);
70 _exit(r);
71 /* never reached*/
72 }
73 else if (pid>0)
74 {
75 d->pid=pid;
76 si_close(pc[0]); si_close(cp[1]);
77 d->f_read=fdopen(cp[0],"r");
78 d->fd_read=cp[0];
79 d->f_write=fdopen(pc[1],"w");
80 d->fd_write=pc[1];
82 }
83 else
84 {
85 Werror("fork failed (%d)",errno);
86 omFreeSize(d,sizeof(*d));
87 l->flags=0;
88 return TRUE;
89 }
90 l->data=d;
91 return FALSE;
92}
EXTERN_VAR BOOLEAN FE_OPT_NO_SHELL_FLAG
Definition extra.cc:166
void WerrorS(const char *s)
Definition feFopen.cc:24
static void * feOptValue(feOptIndex opt)
Definition feOpt.h:40
#define STDOUT_FILENO
Definition feread.cc:43
#define STDIN_FILENO
Definition fereadl.c:52
#define omAlloc0(size)
void Werror(const char *fmt,...)
Definition reporter.cc:189

◆ pipeRead1()

leftv pipeRead1 ( si_link l)
static

Definition at line 138 of file pipeLink.cc.

139{
140 pipeInfo *d = (pipeInfo *)l->data;
141 leftv res=(leftv)omAlloc0(sizeof(sleftv));
142 char *s=(char *)omAlloc0(1024);
143 char *ss=fgets(s,1024,d->f_read);
144 if (ss==NULL) { omFreeSize(s,1024); pipeClose(l);return NULL; }
145 int i=strlen(s)-1;
146 if ((i>=0) && (s[i]=='\n')) s[i]='\0';
147 res->rtyp=STRING_CMD;
148 res->data=s;
149 return res;
150}
int i
Definition cfEzgcd.cc:132
Class used for (list of) interpreter objects.
Definition subexpr.h:83
const CanonicalForm int s
Definition facAbsFact.cc:51
CanonicalForm res
Definition facAbsFact.cc:60
sleftv * leftv
Definition structs.h:53
@ STRING_CMD
Definition tok.h:187

◆ pipeWrite()

BOOLEAN pipeWrite ( si_link l,
leftv data )
static

Definition at line 153 of file pipeLink.cc.

154{
156 pipeInfo *d = (pipeInfo *)l->data;
157 FILE *outfile=d->f_write;;
158 BOOLEAN err=FALSE;
159 char *s;
161 while (data!=NULL)
162 {
163 s = data->String();
164 // free data ??
165 if (s!=NULL)
166 {
167 fprintf(outfile,"%s\n",s);
168 omFree((ADDRESS)s);
169 }
170 else
171 {
172 WerrorS("cannot convert to string");
173 err=TRUE;
174 }
175 if (pipeLastLink==NULL) return TRUE;
176 data = data->next;
177 }
178 fflush(outfile);
180 return err;
181}
leftv next
Definition subexpr.h:86
char * String(void *d=NULL, BOOLEAN typed=FALSE, int dim=1)
Called for conversion to string (used by string(..), write(..),..).
Definition subexpr.cc:765
VAR si_link pipeLastLink
Definition cntrlc.cc:61
#define omFree(addr)

◆ slInitPipeExtension()

si_link_extension slInitPipeExtension ( si_link_extension s)

Definition at line 225 of file pipeLink.cc.

226{
227 s->Open=pipeOpen;
228 s->Close=pipeClose;
229 s->Kill=pipeKill;
230 s->Read=pipeRead1;
231 s->Read2=(slRead2Proc)NULL;
232 s->Write=pipeWrite;
233
234 s->Status=slStatusPipe;
235 s->type="pipe";
236 return s;
237}

◆ slStatusPipe()

const char * slStatusPipe ( si_link l,
const char * request )
static

Definition at line 183 of file pipeLink.cc.

184{
185 pipeInfo *d=(pipeInfo*)l->data;
186 if (d==NULL) return "not open";
187 if(strcmp(request, "read") == 0)
188 {
189 int s;
190 if ((!SI_LINK_R_OPEN_P(l)) || (feof(d->f_read))) s=0;
191 else if (FD_SETSIZE<=d->fd_read)
192 {
193 Werror("file descriptor number too high (%d)",d->fd_read);
194 s=-1;
195 }
196 else
197 {
198 fd_set mask/*, fdmask*/;
199 struct timeval wt;
200 /* Don't block. Return socket status immediately. */
201 wt.tv_sec = 0;
202 wt.tv_usec = 0;
203
204 FD_ZERO(&mask);
205 FD_SET(d->fd_read, &mask);
206 //Print("test fd %d\n",d->fd_read);
207 /* check with select: chars waiting: no -> not ready */
208 s=si_select(d->fd_read+1, &mask, NULL, NULL, &wt);
209 }
210 switch (s)
211 {
212 case 0: /* not ready */ return "not ready";
213 case -1: /*error*/ return "error";
214 default: /*1: ready ? */return "ready";
215 }
216 }
217 else if (strcmp(request, "write") == 0)
218 {
219 if (SI_LINK_W_OPEN_P(l)) return "ready";
220 return "not ready";
221 }
222 return "unknown status request";
223}

Variable Documentation

◆ FE_OPT_NO_SHELL_FLAG

EXTERN_VAR BOOLEAN FE_OPT_NO_SHELL_FLAG

Definition at line 24 of file pipeLink.cc.

◆ pipeLastLink

EXTERN_VAR si_link pipeLastLink

Definition at line 152 of file pipeLink.cc.