Data Structures | Macros | Typedefs | Functions | Variables
silink.h File Reference
#include <singularconfig.h>
#include <kernel/structs.h>
#include <Singular/links/sing_dbm.h>
#include <Singular/lists.h>
#include <Singular/attrib.h>
#include <omalloc/omalloc.h>

Go to the source code of this file.

Data Structures

Macros

#define SI_LINK_CLOSE   0
 
#define SI_LINK_OPEN   1
 
#define SI_LINK_READ   2
 
#define SI_LINK_WRITE   4
 
#define SI_LINK_CLOSE_P(l)   (!(l)->flags)
 
#define SI_LINK_OPEN_P(l)   ((l)->flags & SI_LINK_OPEN)
 
#define SI_LINK_W_OPEN_P(l)   ((l)->flags & SI_LINK_WRITE)
 
#define SI_LINK_R_OPEN_P(l)   ((l)->flags & SI_LINK_READ)
 
#define SI_LINK_RW_OPEN_P(l)   (SI_LINK_W_OPEN_P(l) && SI_LINK_R_OPEN_P(l))
 
#define SI_LINK_SET_CLOSE_P(l)   ((l)->flags = SI_LINK_CLOSE)
 
#define SI_LINK_SET_OPEN_P(l, flag)   ((l)->flags |= SI_LINK_OPEN |flag)
 
#define SI_LINK_SET_W_OPEN_P(l)   ((l)->flags |= (SI_LINK_OPEN | SI_LINK_WRITE))
 
#define SI_LINK_SET_R_OPEN_P(l)   ((l)->flags |= (SI_LINK_OPEN | SI_LINK_READ))
 
#define SI_LINK_SET_RW_OPEN_P(l)   ((l)->flags |= (SI_LINK_OPEN | SI_LINK_READ | SI_LINK_WRITE))
 

Typedefs

typedef ip_link * si_link
 
typedef BOOLEAN(* slOpenProc) (si_link l, short flag, leftv h)
 
typedef BOOLEAN(* slWriteProc) (si_link l, leftv lv)
 
typedef BOOLEAN(* slCloseProc) (si_link l)
 
typedef BOOLEAN(* slPrepCloseProc) (si_link l)
 
typedef BOOLEAN(* slKillProc) (si_link l)
 
typedef leftv(* slReadProc) (si_link l)
 
typedef leftv(* slRead2Proc) (si_link l, leftv a)
 
typedef BOOLEAN(* slDumpProc) (si_link l)
 
typedef BOOLEAN(* slGetDumpProc) (si_link l)
 
typedef const char *(* slStatusProc) (si_link l, const char *request)
 
typedef BOOLEAN(* slSetRingProc) (si_link l, ring r, BOOLEAN send)
 
typedef link_structlink_list
 

Functions

BOOLEAN slOpen (si_link l, short flag, leftv h)
 
BOOLEAN slClose (si_link l)
 
BOOLEAN slPrepClose (si_link l)
 
leftv slRead (si_link l, leftv a=NULL)
 
BOOLEAN slWrite (si_link l, leftv v)
 
BOOLEAN slDump (si_link l)
 
BOOLEAN slGetDump (si_link l)
 
const char * slStatus (si_link l, const char *request)
 
BOOLEAN slInit (si_link l, char *str)
 
void slKill (si_link l)
 
void slCleanUp (si_link l)
 
void slStandardInit ()
 
si_link slCopy (si_link l)
 
char * slString (si_link l)
 
int slStatusSsiL (lists L, int timeout)
 
int ssiBatch (const char *host, const char *port)
 

Variables

omBin s_si_link_extension_bin
 
omBin sip_link_bin
 
omBin ip_link_bin
 
link_list ssiToBeClosed
 
volatile BOOLEAN ssiToBeClosed_inactive
 

Data Structure Documentation

◆ s_si_link_extension

struct s_si_link_extension

Definition at line 35 of file silink.h.

Data Fields
slCloseProc Close
slDumpProc Dump
slGetDumpProc GetDump
slKillProc Kill
si_link_extension next
slOpenProc Open
slPrepCloseProc PrepClose
slReadProc Read
slRead2Proc Read2
slSetRingProc SetRing
slStatusProc Status
const char * type
slWriteProc Write

◆ sip_link

struct sip_link

Definition at line 52 of file silink.h.

Data Fields
void * data
BITSET flags
si_link_extension m
char * mode
char * name
short ref

◆ link_struct

struct link_struct

Definition at line 120 of file silink.h.

Data Fields
si_link l
void * next
leftv u

Macro Definition Documentation

◆ SI_LINK_CLOSE

#define SI_LINK_CLOSE   0

Definition at line 63 of file silink.h.

◆ SI_LINK_CLOSE_P

#define SI_LINK_CLOSE_P (   l)    (!(l)->flags)

Definition at line 69 of file silink.h.

◆ SI_LINK_OPEN

#define SI_LINK_OPEN   1

Definition at line 64 of file silink.h.

◆ SI_LINK_OPEN_P

#define SI_LINK_OPEN_P (   l)    ((l)->flags & SI_LINK_OPEN)

Definition at line 70 of file silink.h.

◆ SI_LINK_R_OPEN_P

#define SI_LINK_R_OPEN_P (   l)    ((l)->flags & SI_LINK_READ)

Definition at line 72 of file silink.h.

◆ SI_LINK_READ

#define SI_LINK_READ   2

Definition at line 65 of file silink.h.

◆ SI_LINK_RW_OPEN_P

#define SI_LINK_RW_OPEN_P (   l)    (SI_LINK_W_OPEN_P(l) && SI_LINK_R_OPEN_P(l))

Definition at line 73 of file silink.h.

◆ SI_LINK_SET_CLOSE_P

#define SI_LINK_SET_CLOSE_P (   l)    ((l)->flags = SI_LINK_CLOSE)

Definition at line 75 of file silink.h.

◆ SI_LINK_SET_OPEN_P

#define SI_LINK_SET_OPEN_P (   l,
  flag 
)    ((l)->flags |= SI_LINK_OPEN |flag)

Definition at line 76 of file silink.h.

◆ SI_LINK_SET_R_OPEN_P

#define SI_LINK_SET_R_OPEN_P (   l)    ((l)->flags |= (SI_LINK_OPEN | SI_LINK_READ))

Definition at line 78 of file silink.h.

◆ SI_LINK_SET_RW_OPEN_P

#define SI_LINK_SET_RW_OPEN_P (   l)    ((l)->flags |= (SI_LINK_OPEN | SI_LINK_READ | SI_LINK_WRITE))

Definition at line 79 of file silink.h.

◆ SI_LINK_SET_W_OPEN_P

#define SI_LINK_SET_W_OPEN_P (   l)    ((l)->flags |= (SI_LINK_OPEN | SI_LINK_WRITE))

Definition at line 77 of file silink.h.

◆ SI_LINK_W_OPEN_P

#define SI_LINK_W_OPEN_P (   l)    ((l)->flags & SI_LINK_WRITE)

Definition at line 71 of file silink.h.

◆ SI_LINK_WRITE

#define SI_LINK_WRITE   4

Definition at line 66 of file silink.h.

Typedef Documentation

◆ link_list

Definition at line 127 of file silink.h.

◆ si_link

typedef ip_link* si_link

Definition at line 19 of file silink.h.

◆ slCloseProc

typedef BOOLEAN(* slCloseProc) (si_link l)

Definition at line 25 of file silink.h.

◆ slDumpProc

typedef BOOLEAN(* slDumpProc) (si_link l)

Definition at line 30 of file silink.h.

◆ slGetDumpProc

typedef BOOLEAN(* slGetDumpProc) (si_link l)

Definition at line 31 of file silink.h.

◆ slKillProc

typedef BOOLEAN(* slKillProc) (si_link l)

Definition at line 27 of file silink.h.

◆ slOpenProc

typedef BOOLEAN(* slOpenProc) (si_link l, short flag, leftv h)

Definition at line 23 of file silink.h.

◆ slPrepCloseProc

typedef BOOLEAN(* slPrepCloseProc) (si_link l)

Definition at line 26 of file silink.h.

◆ slRead2Proc

typedef leftv(* slRead2Proc) (si_link l, leftv a)

Definition at line 29 of file silink.h.

◆ slReadProc

typedef leftv(* slReadProc) (si_link l)

Definition at line 28 of file silink.h.

◆ slSetRingProc

typedef BOOLEAN(* slSetRingProc) (si_link l, ring r, BOOLEAN send)

Definition at line 33 of file silink.h.

◆ slStatusProc

typedef const char*(* slStatusProc) (si_link l, const char *request)

Definition at line 32 of file silink.h.

◆ slWriteProc

typedef BOOLEAN(* slWriteProc) (si_link l, leftv lv)

Definition at line 24 of file silink.h.

Function Documentation

◆ slCleanUp()

void slCleanUp ( si_link  l)

Definition at line 132 of file silink.cc.

133 {
134  defer_shutdown++;
135  (l->ref)--;
136  if (l->ref == 0)
137  {
138  if (SI_LINK_OPEN_P(l))
139  {
140  if (l->m->Close != NULL) l->m->Close(l);
141  }
142  if ((l->data != NULL) && (l->m->Kill != NULL)) l->m->Kill(l);
143  omFree((ADDRESS)l->name);
144  omFree((ADDRESS)l->mode);
145  memset((void *) l, 0, sizeof(ip_link));
146  }
147  defer_shutdown--;
148  if (!defer_shutdown && do_shutdown) m2_end(1);
149 }
void m2_end(int i)
Definition: misc_ip.cc:1072
void * ADDRESS
Definition: auxiliary.h:115
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:83
#define omFree(addr)
Definition: omAllocDecl.h:261
#define NULL
Definition: omList.c:10
volatile int defer_shutdown
Definition: cntrlc.cc:84
int l
Definition: cfEzgcd.cc:94

◆ slClose()

BOOLEAN slClose ( si_link  l)

Definition at line 247 of file silink.cc.

248 {
249 
250  if(! SI_LINK_OPEN_P(l))
251  return FALSE;
252 
253  defer_shutdown++;
254  BOOLEAN res = TRUE;
255  if (l->m->Close != NULL)
256  {
257  res = l->m->Close(l);
258  if (res)
259  Werror("close: Error for link of type: %s, mode: %s, name: %s",
260  l->m->type, l->mode, l->name);
261  }
262  defer_shutdown--;
263  if (!defer_shutdown && do_shutdown) m2_end(1);
265  return res;
266 }
#define FALSE
Definition: auxiliary.h:94
void m2_end(int i)
Definition: misc_ip.cc:1072
#define TRUE
Definition: auxiliary.h:98
poly res
Definition: myNF.cc:322
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:83
#define NULL
Definition: omList.c:10
volatile int defer_shutdown
Definition: cntrlc.cc:84
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ slCopy()

si_link slCopy ( si_link  l)
inline

Definition at line 93 of file silink.h.

94 {
95  l->ref++;
96  return l;
97 }
int l
Definition: cfEzgcd.cc:94

◆ slDump()

BOOLEAN slDump ( si_link  l)

Definition at line 351 of file silink.cc.

352 {
353  BOOLEAN res;
354 
355  if(! SI_LINK_W_OPEN_P(l)) // open w ?
356  {
357  if (slOpen(l, SI_LINK_WRITE,NULL)) return TRUE;
358  }
359 
360  if(SI_LINK_W_OPEN_P(l))
361  { // now open w
362  if (l->m->Dump != NULL)
363  res = l->m->Dump(l);
364  else
365  res = TRUE;
366 
367  if (res)
368  Werror("dump: Error for link of type %s, mode: %s, name: %s",
369  l->m->type, l->mode, l->name);
370  if (!SI_LINK_R_OPEN_P(l)) slClose(l); // do not close r/w links
371  return res;
372  }
373  else
374  {
375  Werror("dump: Error to open link of type %s, mode: %s, name: %s for writing",
376  l->m->type, l->mode, l->name);
377  return TRUE;
378  }
379 }
#define TRUE
Definition: auxiliary.h:98
poly res
Definition: myNF.cc:322
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ slGetDump()

BOOLEAN slGetDump ( si_link  l)

Definition at line 381 of file silink.cc.

382 {
383  BOOLEAN res;
384 
385  if(! SI_LINK_R_OPEN_P(l)) // open r ?
386  {
387  if (slOpen(l, SI_LINK_READ,NULL)) return TRUE;
388  }
389 
390  if(SI_LINK_R_OPEN_P(l))
391  { // now open r
392  if (l->m->GetDump != NULL)
393  res = l->m->GetDump(l);
394  else
395  res = TRUE;
396 
397  if (res)
398  Werror("getdump: Error for link of type %s, mode: %s, name: %s",
399  l->m->type, l->mode, l->name);
400  //res|=slClose(l);
401  return res;
402  }
403  else
404  {
405  Werror("dump: Error open link of type %s, mode: %s, name: %s for reading",
406  l->m->type, l->mode, l->name);
407  return TRUE;
408  }
409 }
#define TRUE
Definition: auxiliary.h:98
poly res
Definition: myNF.cc:322
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ slInit()

BOOLEAN slInit ( si_link  l,
char *  str 
)

Definition at line 53 of file silink.cc.

54 {
55  char *type = NULL, *mode = NULL, *name = NULL;
56  int i = 0, j;
57 
58  // set mode and type
59  if (istr != NULL)
60  {
61  // find the first colon char in istr
62  i = 0;
63  while (istr[i] != ':' && istr[i] != '\0') i++;
64  if (istr[i] == ':')
65  {
66  // if found, set type
67  if (i > 0)
68  {
69  istr[i] = '\0';
70  type = omStrDup(istr);
71  istr[i] = ':';
72  }
73  // and check for mode
74  j = ++i;
75  while (istr[j] != ' ' && istr[j] != '\0') j++;
76  if (j > i)
77  {
78  mode = omStrDup(&(istr[i]));
79  mode[j - i] = '\0';
80  }
81  // and for the name
82  while (istr[j] == ' '&& istr[j] != '\0') j++;
83  if (istr[j] != '\0') name = omStrDup(&(istr[j]));
84  }
85  else // no colon find -- string is entire name
86  {
87  j=0;
88  while (istr[j] == ' '&& istr[j] != '\0') j++;
89  if (istr[j] != '\0') name = omStrDup(&(istr[j]));
90  }
91  }
92 
93  // set the link extension
94  if (type != NULL)
95  {
96  si_link_extension s = si_link_root;
97  si_link_extension prev = s;
98 
99  while (strcmp(s->type, type) != 0)
100  {
101  if (s->next == NULL)
102  {
103  prev = s;
104  s = NULL;
105  break;
106  }
107  else
108  {
109  s = s->next;
110  }
111  }
112 
113  if (s != NULL)
114  l->m = s;
115  else
116  {
117  l->m = slTypeInit(prev, type);
118  }
119  omFree(type);
120  }
121  else
122  l->m = si_link_root;
123 
124  if (l->m == NULL) return TRUE;
125 
126  l->name = (name != NULL ? name : omStrDup(""));
127  l->mode = (mode != NULL ? mode : omStrDup(""));
128  l->ref = 1;
129  return FALSE;
130 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
int j
Definition: myNF.cc:70
#define omFree(addr)
Definition: omAllocDecl.h:261
int i
Definition: cfEzgcd.cc:123
char name(const Variable &v)
Definition: factory.h:178
#define NULL
Definition: omList.c:10
int l
Definition: cfEzgcd.cc:94
#define omStrDup(s)
Definition: omAllocDecl.h:263

◆ slKill()

void slKill ( si_link  l)

Definition at line 151 of file silink.cc.

152 {
153  defer_shutdown++;
154  slCleanUp(l);
155  if ((l!=NULL) &&(l->ref == 0))
157  defer_shutdown--;
158  if (!defer_shutdown && do_shutdown) m2_end(1);
159 }
void m2_end(int i)
Definition: misc_ip.cc:1072
void * ADDRESS
Definition: auxiliary.h:115
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:83
#define NULL
Definition: omList.c:10
volatile int defer_shutdown
Definition: cntrlc.cc:84
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
int l
Definition: cfEzgcd.cc:94

◆ slOpen()

BOOLEAN slOpen ( si_link  l,
short  flag,
leftv  h 
)

Definition at line 199 of file silink.cc.

200 {
201  BOOLEAN res = TRUE;
202  if (l!=NULL)
203  {
204 
205  if (l->m == NULL) slInit(l, ((char*)""));
206 
207  if (feOptValue(FE_OPT_NO_SHELL)) {WerrorS("no links allowed");return TRUE;}
208 
209  const char *c="_";;
210  if (h!=NULL) c=h->Name();
211 
212  if (SI_LINK_OPEN_P(l))
213  {
214  Warn("open: link of type: %s, mode: %s, name: %s is already open",
215  l->m->type, l->mode, l->name);
216  return FALSE;
217  }
218  else if (l->m->Open != NULL)
219  {
220  res = l->m->Open(l, flag, h);
221  if (res)
222  Werror("open: Error for link %s of type: %s, mode: %s, name: %s",
223  c, l->m->type, l->mode, l->name);
224  }
225  if (l->m->SetRing==NULL) l->m->SetRing=slSetRingDummy;
226  }
227  return res;
228 }
static void * feOptValue(feOptIndex opt)
Definition: feOpt.h:40
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
void WerrorS(const char *s)
Definition: feFopen.cc:24
const char * Name()
Definition: subexpr.h:121
poly res
Definition: myNF.cc:322
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94
#define Warn
Definition: emacs.cc:80

◆ slPrepClose()

BOOLEAN slPrepClose ( si_link  l)

Definition at line 230 of file silink.cc.

231 {
232 
233  if(! SI_LINK_OPEN_P(l))
234  return FALSE;
235 
236  BOOLEAN res = TRUE;
237  if (l->m->PrepClose != NULL)
238  {
239  res = l->m->PrepClose(l);
240  if (res)
241  Werror("close: Error for link of type: %s, mode: %s, name: %s",
242  l->m->type, l->mode, l->name);
243  }
244  return res;
245 }
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
poly res
Definition: myNF.cc:322
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ slRead()

leftv slRead ( si_link  l,
leftv  a = NULL 
)

Definition at line 268 of file silink.cc.

269 {
270  leftv v = NULL;
271  if( ! SI_LINK_R_OPEN_P(l)) // open r ?
272  {
273 #ifdef HAVE_DBM
274 #ifdef USE_GDBM
275  if (! SI_LINK_CLOSE_P(l))
276  {
277  if (slClose(l)) return NULL;
278  }
279 #endif
280 #endif
281  if (slOpen(l, SI_LINK_READ,NULL)) return NULL;
282  }
283 
284  if (SI_LINK_R_OPEN_P(l))
285  { // open r
286  if (a==NULL)
287  {
288  if (l->m->Read != NULL) v = l->m->Read(l);
289  }
290  else
291  {
292  if (l->m->Read2 != NULL) v = l->m->Read2(l,a);
293  }
294  }
295  else
296  {
297  Werror("read: Error to open link of type %s, mode: %s, name: %s for reading",
298  l->m->type, l->mode, l->name);
299  return NULL;
300  }
301 
302  // here comes the eval:
303  if (v != NULL)
304  {
305  if (v->Eval() && !errorreported)
306  WerrorS("eval: failed");
307  }
308  else
309  Werror("read: Error for link of type %s, mode: %s, name: %s",
310  l->m->type, l->mode, l->name);
311  return v;
312 }
Class used for (list of) interpreter objects.
Definition: subexpr.h:83
int Eval()
Definition: subexpr.cc:1760
void WerrorS(const char *s)
Definition: feFopen.cc:24
short errorreported
Definition: feFopen.cc:23
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:37
#define NULL
Definition: omList.c:10
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ slStandardInit()

void slStandardInit ( )

Definition at line 574 of file asciiLink.cc.

575 {
576  si_link_extension s;
579  si_link_root->Close=slCloseAscii;
580  si_link_root->Kill=NULL;
582  si_link_root->Read2=slReadAscii2;
583  si_link_root->Write=slWriteAscii;
585  si_link_root->GetDump=slGetDumpAscii;
586  si_link_root->Status=slStatusAscii;
587  si_link_root->type="ASCII";
588  s = si_link_root;
589  s->next = NULL;
590 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
#define omAlloc0Bin(bin)
Definition: omAllocDecl.h:206
#define NULL
Definition: omList.c:10

◆ slStatus()

const char* slStatus ( si_link  l,
const char *  request 
)

Definition at line 161 of file silink.cc.

162 {
163  if (l == NULL) return "empty link";
164  else if (l->m == NULL) return "unknown link type";
165  else if (strcmp(request, "type") == 0) return l->m->type;
166  else if (strcmp(request, "mode") == 0) return l->mode;
167  else if (strcmp(request, "name") == 0) return l->name;
168  else if (strcmp(request, "exists") ==0)
169  {
170  struct stat buf;
171  if (si_lstat(l->name,&buf)==0) return "yes";
172  else return "no";
173  }
174  else if (strcmp(request, "open") == 0)
175  {
176  if (SI_LINK_OPEN_P(l)) return "yes";
177  else return "no";
178  }
179  else if (strcmp(request, "openread") == 0)
180  {
181  if (SI_LINK_R_OPEN_P(l)) return "yes";
182  else return "no";
183  }
184  else if (strcmp(request, "openwrite") == 0)
185  {
186  if (SI_LINK_W_OPEN_P(l)) return "yes";
187  else return "no";
188  }
189  else if (l->m->Status == NULL) return "unknown status request";
190  else return l->m->Status(l, request);
191 }
int status int void * buf
Definition: si_signals.h:59
#define NULL
Definition: omList.c:10
int l
Definition: cfEzgcd.cc:94

◆ slStatusSsiL()

int slStatusSsiL ( lists  L,
int  timeout 
)

Definition at line 1633 of file ssiLink.cc.

1634 {
1635 // input: L: a list with links of type
1636 // ssi-connect, ssi-fork, ssi-tcp, MPtcp-fork or MPtcp-launch.
1637 // Note: Not every entry in L must be set.
1638 // timeout: timeout for select in micro-seconds
1639 // or -1 for infinity
1640 // or 0 for polling
1641 // returns: ERROR (via Werror): L has wrong elements or link not open
1642 // -2: select returns an error
1643 // -1: the read state of all links is eof
1644 // 0: timeout (or polling): none ready,
1645 // i>0: (at least) L[i] is ready
1646  si_link l;
1647  ssiInfo *d;
1648  int d_fd;
1649  fd_set mask, fdmask;
1650  FD_ZERO(&fdmask);
1651  FD_ZERO(&mask);
1652  int max_fd=0; /* 1 + max fd in fd_set */
1653 
1654  /* timeout */
1655  struct timeval wt;
1656  struct timeval *wt_ptr=&wt;
1657  int startingtime = getRTimer()/TIMER_RESOLUTION; // in seconds
1658  if (timeout== -1)
1659  {
1660  wt_ptr=NULL;
1661  }
1662  else
1663  {
1664  wt.tv_sec = timeout / 1000000;
1665  wt.tv_usec = timeout % 1000000;
1666  }
1667 
1668  /* auxiliary variables */
1669  int i;
1670  int j;
1671  int k;
1672  int s;
1673  char fdmaskempty;
1674 
1675  /* check the links and fill in fdmask */
1676  /* check ssi links for ungetc_buf */
1677  for(i=L->nr; i>=0; i--)
1678  {
1679  if (L->m[i].Typ()!=DEF_CMD)
1680  {
1681  if (L->m[i].Typ()!=LINK_CMD)
1682  { WerrorS("all elements must be of type link"); return -2;}
1683  l=(si_link)L->m[i].Data();
1684  if(SI_LINK_OPEN_P(l)==0)
1685  { WerrorS("all links must be open"); return -2;}
1686  if (((strcmp(l->m->type,"ssi")!=0) && (strcmp(l->m->type,"MPtcp")!=0))
1687  || ((strcmp(l->mode,"fork")!=0) && (strcmp(l->mode,"tcp")!=0)
1688  && (strcmp(l->mode,"launch")!=0) && (strcmp(l->mode,"connect")!=0)))
1689  {
1690  WerrorS("all links must be of type ssi:fork, ssi:tcp, ssi:connect");
1691  return -2;
1692  }
1693  if (strcmp(l->m->type,"ssi")==0)
1694  {
1695  d=(ssiInfo*)l->data;
1696  d_fd=d->fd_read;
1697  if (!s_isready(d->f_read))
1698  {
1699  FD_SET(d_fd, &fdmask);
1700  if (d_fd > max_fd) max_fd=d_fd;
1701  }
1702  else
1703  return i+1;
1704  }
1705  else
1706  {
1707  Werror("wrong link type >>%s<<",l->m->type);
1708  return -2;
1709  }
1710  }
1711  }
1712  max_fd++;
1713 
1714 do_select:
1715  /* copy fdmask to mask */
1716  FD_ZERO(&mask);
1717  for(k = 0; k < max_fd; k++)
1718  {
1719  if(FD_ISSET(k, &fdmask))
1720  {
1721  FD_SET(k, &mask);
1722  }
1723  }
1724 
1725  /* check with select: chars waiting: no -> not ready */
1726  s = si_select(max_fd, &mask, NULL, NULL, wt_ptr);
1727  if (s==-1)
1728  {
1729  WerrorS("error in select call");
1730  return -2; /*error*/
1731  }
1732  if (s==0)
1733  {
1734  return 0; /*poll: not ready */
1735  }
1736  else /* s>0, at least one ready (the number of fd which are ready is s)*/
1737  {
1738  j=0;
1739  while (j<=max_fd) { if (FD_ISSET(j,&mask)) break; j++; }
1740  for(i=L->nr; i>=0; i--)
1741  {
1742  if (L->m[i].rtyp==LINK_CMD)
1743  {
1744  l=(si_link)L->m[i].Data();
1745  if (strcmp(l->m->type,"ssi")==0)
1746  {
1747  d=(ssiInfo*)l->data;
1748  d_fd=d->fd_read;
1749  if(j==d_fd) break;
1750  }
1751  else
1752  {
1753  Werror("wrong link type >>%s<<",l->m->type);
1754  return -2;
1755  }
1756  }
1757  }
1758  // only ssi links:
1759  loop
1760  {
1761  /* yes: read 1 char*/
1762  /* if \n, check again with select else ungetc(c), ready*/
1763  /* setting: d: current ssiInfo, j current fd, i current entry in L*/
1764  int c=s_getc(d->f_read);
1765  //Print("try c=%d\n",c);
1766  if (c== -1) /* eof */
1767  {
1768  FD_CLR(j,&fdmask);
1769  fdmaskempty = 1;
1770  for(k = 0; k < max_fd; k++)
1771  {
1772  if(FD_ISSET(k, &fdmask))
1773  {
1774  fdmaskempty = 0;
1775  break;
1776  }
1777  }
1778  if(fdmaskempty)
1779  {
1780  return -1;
1781  }
1782  if(timeout != -1)
1783  {
1784  timeout = si_max(0,
1785  timeout - 1000000*(getRTimer()/TIMER_RESOLUTION - startingtime));
1786  wt.tv_sec = timeout / 1000000;
1787  wt.tv_usec = (timeout % 1000000);
1788  }
1789  goto do_select;
1790  }
1791 
1792  else if (isdigit(c))
1793  { s_ungetc(c,d->f_read); return i+1; }
1794  else if (c>' ')
1795  {
1796  Werror("unknown char in ssiLink(%d)",c);
1797  return -2;
1798  }
1799  /* else: next char */
1800  goto do_select;
1801  }
1802  }
1803 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
sleftv * m
Definition: lists.h:45
loop
Definition: myNF.cc:98
if(0 > strat->sl)
Definition: myNF.cc:73
int getRTimer()
Definition: timer.cc:172
void WerrorS(const char *s)
Definition: feFopen.cc:24
int k
Definition: cfEzgcd.cc:93
int Typ()
Definition: subexpr.cc:995
int s_getc(s_buff F)
Definition: s_buff.cc:56
#define TIMER_RESOLUTION
Definition: mod2.h:32
int j
Definition: myNF.cc:70
Definition: tok.h:58
void s_ungetc(int c, s_buff F)
Definition: s_buff.cc:97
static int si_max(const int a, const int b)
Definition: auxiliary.h:120
int i
Definition: cfEzgcd.cc:123
int nr
Definition: lists.h:43
Definition: tok.h:116
#define NULL
Definition: omList.c:10
int rtyp
Definition: subexpr.h:92
void * Data()
Definition: subexpr.cc:1137
int s_isready(s_buff F)
Definition: s_buff.cc:83
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ slString()

char* slString ( si_link  l)
inline

Definition at line 100 of file silink.h.

101 {
102  if (l->name != NULL)
103  {
104  return omStrDup(l->name);
105  }
106  else
107  {
108  return omStrDup("");
109  }
110 }
#define NULL
Definition: omList.c:10
int l
Definition: cfEzgcd.cc:94
#define omStrDup(s)
Definition: omAllocDecl.h:263

◆ slWrite()

BOOLEAN slWrite ( si_link  l,
leftv  v 
)

Definition at line 314 of file silink.cc.

315 {
316  BOOLEAN res;
317 
318  if(! SI_LINK_W_OPEN_P(l)) // open w ?
319  {
320 #ifdef HAVE_DBM
321 #ifdef USE_GDBM
322  if (! SI_LINK_CLOSE_P(l))
323  {
324  if (slClose(l)) return TRUE;
325  }
326 #endif
327 #endif
328  if (slOpen(l, SI_LINK_WRITE,NULL)) return TRUE;
329  }
330 
331  if (SI_LINK_W_OPEN_P(l))
332  { // now open w
333  if (l->m->Write != NULL)
334  res = l->m->Write(l,v);
335  else
336  res = TRUE;
337 
338  if (res)
339  Werror("write: Error for link of type %s, mode: %s, name: %s",
340  l->m->type, l->mode, l->name);
341  return res;
342  }
343  else
344  {
345  Werror("write: Error to open link of type %s, mode: %s, name: %s for writing",
346  l->m->type, l->mode, l->name);
347  return TRUE;
348  }
349 }
#define TRUE
Definition: auxiliary.h:98
poly res
Definition: myNF.cc:322
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:94

◆ ssiBatch()

int ssiBatch ( const char *  host,
const char *  port 
)

Definition at line 1805 of file ssiLink.cc.

1807 {
1809  char *buf=(char*)omAlloc(256);
1810  sprintf(buf,"ssi:connect %s:%s",host,port);
1811  slInit(l, buf);
1812  omFreeSize(buf,256);
1813  if (slOpen(l,SI_LINK_OPEN,NULL)) return 1;
1815 
1816  idhdl id = enterid(omStrDup("link_ll"), 0, LINK_CMD, &IDROOT, FALSE);
1817  IDLINK(id) = l;
1818 
1819  loop
1820  {
1821  leftv h=ssiRead1(l); /*contains an exit.... */
1822  if (feErrors != NULL && *feErrors != '\0')
1823  {
1824  // handle errors:
1825  PrintS(feErrors); /* currently quite simple */
1826  *feErrors = '\0';
1827  }
1828  ssiWrite(l,h);
1829  h->CleanUp();
1830  omFreeBin(h, sleftv_bin);
1831  }
1832  /* never reached*/
1833  exit(0);
1834 }
Class used for (list of) interpreter objects.
Definition: subexpr.h:83
#define IDLINK(a)
Definition: ipid.h:135
loop
Definition: myNF.cc:98
#define FALSE
Definition: auxiliary.h:94
#define omFreeSize(addr, size)
Definition: omAllocDecl.h:260
#define IDROOT
Definition: ipid.h:20
#define omAlloc(size)
Definition: omAllocDecl.h:210
Definition: idrec.h:34
idhdl enterid(const char *s, int lev, int t, idhdl *root, BOOLEAN init, BOOLEAN search)
Definition: ipid.cc:258
char * feErrors
Definition: reporter.cc:47
int status int void * buf
Definition: si_signals.h:59
omBin sleftv_bin
Definition: subexpr.cc:50
void PrintS(const char *s)
Definition: reporter.cc:284
#define omAlloc0Bin(bin)
Definition: omAllocDecl.h:206
Definition: tok.h:116
#define NULL
Definition: omList.c:10
void CleanUp(ring r=currRing)
Definition: subexpr.cc:332
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
static Poly * h
Definition: janet.cc:978
int l
Definition: cfEzgcd.cc:94
#define omStrDup(s)
Definition: omAllocDecl.h:263

Variable Documentation

◆ ip_link_bin

omBin ip_link_bin

Definition at line 47 of file silink.cc.

◆ s_si_link_extension_bin

omBin s_si_link_extension_bin

Definition at line 45 of file silink.cc.

◆ sip_link_bin

omBin sip_link_bin

Definition at line 46 of file silink.cc.

◆ ssiToBeClosed

link_list ssiToBeClosed

Definition at line 70 of file ssiLink.cc.

◆ ssiToBeClosed_inactive

volatile BOOLEAN ssiToBeClosed_inactive

Definition at line 71 of file ssiLink.cc.