8 #define TRANSEXT_PRIVATES 1 46 #include <sys/types.h> 49 #include <netinet/in.h> 51 #define SSI_VERSION 12 83 sprintf(name,
"ssiRing%d",nr); nr++;
114 fprintf(d->
f_write,
"%d %s ",(
int)strlen(s),s);
136 fraction
f=(fraction)n;
144 else if (cf->cfWriteFd!=
NULL)
148 else WerrorS(
"coeff field not implemented");
167 fprintf(d->
f_write,
"-1 %d ",r->N);
169 fprintf(d->
f_write,
"-2 %d ",r->N);
172 fprintf(d->
f_write,
"-3 %d ",r->N);
179 fprintf(d->
f_write,
"%d %s ",(
int)strlen(r->names[i]),r->names[i]);
184 if (r->order!=
NULL)
while (r->order[i]!=0) i++;
188 if (r->order!=
NULL)
while(r->order[i]!=0)
190 fprintf(d->
f_write,
"%d %d %d ",r->order[i],r->block0[i], r->block1[i]);
201 for(ii=r->block0[i];ii<=r->block1[i];ii++)
202 fprintf(d->
f_write,
"%d ",r->wvhdl[i][ii-r->block0[i]]);
210 Werror(
"ring oder not implemented for ssi:%d",r->order[i]);
322 fprintf(d->
f_write,
"%d %d ",D->argc,D->op);
323 if (D->argc >0)
ssiWrite(l, &(D->arg1));
326 if (D->argc >1)
ssiWrite(l, &(D->arg2));
327 if (D->argc >2)
ssiWrite(l, &(D->arg3));
345 fprintf(d->
f_write,
"%d ",Ll+1);
356 for(i=0;i<v->
length();i++)
358 fprintf(d->
f_write,
"%d ",(*v)[i]);
365 for(i=0;i<v->
length();i++)
367 fprintf(d->
f_write,
"%d ",(*v)[i]);
375 for(i=0;i<v->
length();i++)
401 if (cf->cfReadFd!=
NULL)
408 fraction
f=(fraction)
n_Init(1,cf);
419 else WerrorS(
"coeffs not implemented in ssiReadNumber");
428 if (n->s!=3)
Werror(
"invalid sub type in bigint:%d",n->s);
453 Werror(
"cannot find cf:%s",cf_name);
460 names=(
char**)
omAlloc(N*
sizeof(
char*));
470 int *block0=(
int *)
omAlloc0((num_ord+1)*
sizeof(int));
471 int *block1=(
int *)
omAlloc0((num_ord+1)*
sizeof(int));
472 int **wvhdl=(
int**)
omAlloc0((num_ord+1)*
sizeof(
int*));
473 for(i=0;i<num_ord;i++)
487 wvhdl[
i]=(
int*)
omAlloc((block1[i]-block0[i]+1)*
sizeof(int));
489 for(ii=block0[i];ii<=block1[
i];ii++)
498 Werror(
"ring oder not implemented for ssi:%d",ord[i]);
516 r=
rDefault(ch,N,names,num_ord,ord,block0,block1,wvhdl);
523 r=
rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
531 r=
rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
535 r=
rDefault(cf,N,names,num_ord,ord,block0,block1,wvhdl);
539 Werror(
"ssi: read unknown coeffs type (%d)",ch);
576 for(i=1;i<=
rVar(r);i++)
583 if (ret==
NULL) ret=
p;
640 D->argc=argc;
D->op=op;
645 memcpy(&(
D->arg1),v,
sizeof(*v));
653 memcpy(&(
D->arg2),v,
sizeof(*v));
659 memcpy(&(
D->arg3),v,
sizeof(*v));
698 for(i=0;i<=L->
nr;i++)
701 memcpy(&(L->
m[i]),v,
sizeof(*v));
711 for(
int i=0;
i<nr;
i++)
723 for(
int i=0;
i<r*c;
i++)
735 for(
int i=0;
i<r*c;
i++)
753 b->blackbox_deserialize(&b,&(res->
data),l);
757 Werror(
"blackbox %s not found",name);
769 for(
int i=1;
i<nr_of_attr;
i++)
774 memcpy(res,tmp,
sizeof(
sleftv));
775 memset(tmp,0,
sizeof(
sleftv));
792 if (l->mode[0] !=
'\0' && (strcmp(l->mode,
"r") == 0))
798 else if (strcmp(l->mode,
"w") == 0) mode =
"w";
799 else if (strcmp(l->mode,
"fork") == 0) mode =
"fork";
800 else if (strcmp(l->mode,
"tcp") == 0) mode =
"tcp";
801 else if (strcmp(l->mode,
"connect") == 0) mode =
"connect";
811 if (l->name[0] ==
'\0')
813 if (strcmp(mode,
"fork")==0)
818 n->
next=(
void *)ssiToBeClosed;
826 if (pid == -1 && errno == EAGAIN)
839 sigemptyset(&sigint);
840 sigaddset(&sigint, SIGINT);
841 sigprocmask(SIG_BLOCK, &sigint,
NULL);
859 #ifdef HAVE_SIMPLEIPC 861 #endif // HAVE_SIMPLEIPC 862 si_close(pc[1]); si_close(cp[0]);
901 si_close(pc[0]); si_close(cp[1]);
913 Werror(
"fork failed (%d)",errno);
920 else if (strcmp(mode,
"tcp")==0)
922 int sockfd, newsockfd, portno, clilen;
923 struct sockaddr_in serv_addr, cli_addr;
924 sockfd = socket(AF_INET, SOCK_STREAM, 0);
927 WerrorS(
"ERROR opening socket");
932 memset((
char *) &serv_addr,0,
sizeof(serv_addr));
934 serv_addr.sin_family = AF_INET;
935 serv_addr.sin_addr.s_addr = INADDR_ANY;
939 serv_addr.sin_port = htons(portno);
942 WerrorS(
"ERROR on binding (no free port available?)");
948 while(bind(sockfd, (
struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0);
951 newsockfd = si_accept(sockfd, (
struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
959 PrintS(
"client accepted\n");
963 d->
f_write = fdopen(newsockfd,
"w");
970 Werror(
"invalid mode >>%s<< for ssi",mode);
980 if(strcmp(mode,
"tcp")==0)
982 int sockfd, newsockfd, portno, clilen;
983 struct sockaddr_in serv_addr, cli_addr;
984 sockfd = socket(AF_INET, SOCK_STREAM, 0);
987 WerrorS(
"ERROR opening socket");
992 memset((
char *) &serv_addr,0,
sizeof(serv_addr));
994 serv_addr.sin_family = AF_INET;
995 serv_addr.sin_addr.s_addr = INADDR_ANY;
999 serv_addr.sin_port = htons(portno);
1002 WerrorS(
"ERROR on binding (no free port available?)");
1007 while(bind(sockfd, (
struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0);
1010 char* cli_host = (
char*)
omAlloc(256);
1011 char* path = (
char*)
omAlloc(1024);
1012 int r = si_sscanf(l->name,
"%255[^:]:%s",cli_host,path);
1015 WerrorS(
"ERROR: no host specified");
1024 WarnS(
"program not specified, using /usr/local/bin/Singular");
1026 strcpy(path,
"/usr/local/bin/Singular");
1028 char* ssh_command = (
char*)
omAlloc(256);
1029 char* ser_host = (
char*)
omAlloc(64);
1030 gethostname(ser_host,64);
1031 sprintf(ssh_command,
"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1039 clilen =
sizeof(cli_addr);
1040 newsockfd = si_accept(sockfd, (
struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1052 d->
f_write = fdopen(newsockfd,
"w");
1059 newlink->
next=(
void *)ssiToBeClosed;
1060 ssiToBeClosed=newlink;
1064 else if(strcmp(mode,
"connect")==0)
1066 char* host = (
char*)
omAlloc(256);
1068 struct sockaddr_in serv_addr;
1069 struct hostent *server;
1071 si_sscanf(l->name,
"%255[^:]:%d",host,&portno);
1075 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1076 if (sockfd < 0) {
WerrorS(
"ERROR opening socket");
return TRUE; }
1077 server = gethostbyname(host);
1079 memset((
char *) &serv_addr, 0,
sizeof(serv_addr));
1080 serv_addr.sin_family = AF_INET;
1081 memcpy((
char *)&serv_addr.sin_addr.s_addr,
1082 (
char *)server->h_addr,
1084 serv_addr.sin_port = htons(portno);
1085 if (si_connect(sockfd,(sockaddr*)&serv_addr,
sizeof(serv_addr)) < 0)
1086 {
Werror(
"ERROR connecting(errno=%d)",errno);
return TRUE; }
1090 d->
f_write=fdopen(sockfd,
"w");
1107 char *filename=l->name;
1109 if(filename[0]==
'>')
1111 if (filename[1]==
'>')
1122 outfile=
myfopen(filename,mode);
1125 if (strcmp(l->mode,
"r")==0)
1187 si_waitpid(d->
pid,
NULL,WNOHANG);
1189 && (kill(d->
pid,0)==0))
1193 t.tv_nsec=100000000;
1194 struct timespec rem;
1199 r = nanosleep(&t, &rem);
1202 if (si_waitpid(d->
pid,
NULL,WNOHANG) != 0)
break;
1204 if ((r==0) || (errno != EINTR))
break;
1206 if (kill(d->
pid,0) == 0)
1214 r = nanosleep(&t, &rem);
1217 if (si_waitpid(d->
pid,
NULL,WNOHANG) != 0)
break;
1219 if ((r==0) || (errno != EINTR))
break;
1221 if (kill(d->
pid,0) == 0)
1230 if ((strcmp(l->mode,
"tcp")==0)
1231 || (strcmp(l->mode,
"fork")==0))
1288 res->data=(
char*)d->
r;
1299 if (d->
r==
NULL)
goto no_ring;
1303 if (d->
r==
NULL)
goto no_ring;
1307 if (d->
r==
NULL)
goto no_ring;
1311 if (d->
r==
NULL)
goto no_ring;
1317 if (d->
r==
NULL)
goto no_ring;
1329 int nok=
res->Eval();
1330 if (nok)
WerrorS(
"error in eval");
1337 int nok=
res->Eval();
1338 if (nok)
WerrorS(
"error in name lookup");
1373 Print(
"incompatible versions of ssi: %d/%d vs %d/%d\n",
1378 Print(
"// opening ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
1392 default:
Werror(
"not implemented (t:%d)",t);
1401 && (
res->RingDependend()))
1440 void *dd=data->
Data();
1450 else if (data->
flag!=0)
1525 fprintf(d->
f_write,
"10 %d ",(
int)M->rank);
1562 b->blackbox_serialize(b,dd,l);
1566 Werror(
"not implemented (t:%d, rtyp:%d)",tt, data->
rtyp);
1602 if (d==
NULL)
return "not open";
1603 if (((strcmp(l->mode,
"fork")==0)
1604 ||(strcmp(l->mode,
"tcp")==0)
1605 ||(strcmp(l->mode,
"connect")==0))
1606 && (strcmp(request,
"read") == 0))
1623 case 0:
return "not ready";
1624 case -1:
return "error";
1631 if (c== -1)
return "eof";
1632 else if (isdigit(c))
1636 Werror(
"unknown char in ssiLink(%d)",c);
1642 else if (strcmp(request,
"read") == 0)
1645 else return "not ready";
1647 else if (strcmp(request,
"write") == 0)
1650 else return "not ready";
1652 else return "unknown status request";
1671 fd_set mask, fdmask;
1678 struct timeval *wt_ptr=&wt;
1686 wt.tv_sec = timeout / 1000000;
1687 wt.tv_usec = timeout % 1000000;
1699 for(i=L->
nr; i>=0; i--)
1704 {
WerrorS(
"all elements must be of type link");
return -2;}
1707 {
WerrorS(
"all links must be open");
return -2;}
1708 if (((strcmp(l->m->type,
"ssi")!=0) && (strcmp(l->m->type,
"MPtcp")!=0))
1709 || ((strcmp(l->mode,
"fork")!=0) && (strcmp(l->mode,
"tcp")!=0)
1710 && (strcmp(l->mode,
"launch")!=0) && (strcmp(l->mode,
"connect")!=0)))
1712 WerrorS(
"all links must be of type ssi:fork, ssi:tcp, ssi:connect");
1715 if (strcmp(l->m->type,
"ssi")==0)
1721 FD_SET(d_fd, &fdmask);
1722 if (d_fd > max_fd) max_fd=d_fd;
1729 Werror(
"wrong link type >>%s<<",l->m->type);
1739 for(k = 0; k < max_fd; k++)
1741 if(FD_ISSET(k, &fdmask))
1748 s = si_select(max_fd, &mask,
NULL,
NULL, wt_ptr);
1751 WerrorS(
"error in select call");
1761 while (j<=max_fd) {
if (FD_ISSET(j,&mask))
break; j++; }
1762 for(i=L->
nr; i>=0; i--)
1767 if (strcmp(l->m->type,
"ssi")==0)
1775 Werror(
"wrong link type >>%s<<",l->m->type);
1792 for(k = 0; k < max_fd; k++)
1794 if(FD_ISSET(k, &fdmask))
1808 wt.tv_sec = timeout / 1000000;
1809 wt.tv_usec = (timeout % 1000000);
1814 else if (isdigit(c))
1818 Werror(
"unknown char in ssiLink(%d)",c);
1832 sprintf(buf,
"ssi:connect %s:%s",host,port);
1866 WerrorS(
"ERROR already a reverved port requested");
1873 WerrorS(
"ERROR opening socket");
1878 ssiResverd_serv_addr.sin_family = AF_INET;
1879 ssiResverd_serv_addr.sin_addr.s_addr = INADDR_ANY;
1883 ssiResverd_serv_addr.sin_port = htons(portno);
1886 WerrorS(
"ERROR on binding (no free port available?)");
1890 while(bind(
ssiReserved_sockfd, (
struct sockaddr *) &ssiResverd_serv_addr,
sizeof(ssiResverd_serv_addr)) < 0);
1902 WerrorS(
"ERROR no reverved port requested");
1905 struct sockaddr_in cli_addr;
1906 int clilen =
sizeof(cli_addr);
1907 int newsockfd = si_accept(
ssiReserved_sockfd, (
struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1910 Werror(
"ERROR on accept (errno=%d)",errno);
1915 si_link_extension prev =
s;
1916 while (strcmp(s->type,
"ssi") != 0)
1918 if (s->next ==
NULL)
1945 d->
f_write = fdopen(newsockfd,
"w");
1976 kidpid = si_waitpid(-1, &status, WNOHANG);
1980 if (errno == EINTR)
continue;
1984 else if (kidpid==0)
break;
2013 int type_id =
IDTYP(h);
2025 if ((type_id ==
RING_CMD) && (strncmp(
IDID(h),
"ssiRing",7)==0))
2031 if (strcmp(
IDID(h),
"ZZ")==0)
return FALSE;
2032 if (strcmp(
IDID(h),
"QQ")==0)
return FALSE;
2034 if (strcmp(
IDID(h),
"AE")==0)
return FALSE;
2035 if (strcmp(
IDID(h),
"QAE")==0)
return FALSE;
2041 memset(&tmp,0,
sizeof(tmp));
2048 if ((strcmp(
IDID(h),
"Top") == 0)
2049 || (strcmp(
IDID(h),
"Standard") == 0))
2054 package p=(package)IDDATA(h);
2061 D->arg1.data=
p->libname;
2063 D->arg2.data=(
char*)
"with";
2074 D->arg1.data=
p->libname;
2086 D->arg1.name=
IDID(h);
2087 D->arg2.rtyp=
IDTYP(h);
2109 && (strncmp(
IDID(h),
"ssiRing",7)!=0))
for idElimination, like a, except pFDeg, pWeigths ignore it
n_coeffType rFieldType(ring r)
int s_readbytes(char *buff, int len, s_buff F)
number ssiReadNumber(const ssiInfo *d)
const CanonicalForm int s
ring ssiReadRing(const ssiInfo *d)
si_link_extension si_link_root
char *(* fe_fgets_stdin)(const char *pr, char *s, int size)
ideal ssiReadIdeal_R(const ssiInfo *d, const ring r)
Class used for (list of) interpreter objects.
void rem(unsigned long *a, unsigned long *q, unsigned long p, int °a, int degq)
void ssiWriteRing_R(ssiInfo *d, const ring r)
used for all transcendental extensions, i.e., the top-most extension in an extension tower is transce...
void ssiWriteInt(const ssiInfo *d, const int i)
static BOOLEAN ssiDumpIter(si_link l, idhdl h)
BOOLEAN ssiClose(si_link l)
static unsigned long p_SetComp(poly p, unsigned long c, ring r)
#define SI_LINK_R_OPEN_P(l)
BOOLEAN ssiWrite(si_link l, leftv data)
si_link_extension slInitSsiExtension(si_link_extension s)
static FORCE_INLINE number n_Init(long i, const coeffs r)
a number representing i in the given coeff field/ring r
#define omFreeSize(addr, size)
static BOOLEAN DumpSsiIdhdl(si_link l, idhdl h)
static short rVar(const ring r)
#define rVar(r) (r->N)
char * fe_fgets_dummy(const char *, char *, int)
void ssiWriteIdeal_R(const ssiInfo *d, int typ, const ideal I, const ring r)
void ssiWriteBigInt(const ssiInfo *d, const number n)
leftv(* slRead2Proc)(si_link l, leftv a)
static FORCE_INLINE int n_GetChar(const coeffs r)
Return the characteristic of the coeff. domain.
void ssiReadBlackbox(leftv res, si_link l)
number ssiReadBigInt(const ssiInfo *d)
BOOLEAN ssiSetRing(si_link l, ring r, BOOLEAN send)
void WerrorS(const char *s)
void ssiWriteIntmat(const ssiInfo *d, intvec *v)
void ssiWriteNumber(const ssiInfo *d, const number n)
static number & pGetCoeff(poly p)
return an alias to the leading coefficient of p assumes that p != NULL NOTE: not copy ...
poly ssiReadPoly_R(const ssiInfo *D, const ring r)
static FORCE_INLINE number n_ReadFd(const ssiInfo *f, const coeffs r)
io via ssi:
static struct sockaddr_in ssiResverd_serv_addr
BOOLEAN slOpen(si_link l, short flag, leftv h)
matrix ssiReadMatrix(const ssiInfo *d)
#define SI_LINK_SET_CLOSE_P(l)
static int ssiReserved_sockfd
int slStatusSsiL(lists L, int timeout)
omBin s_si_link_extension_bin
BOOLEAN ssiDump(si_link l)
void ssiWriteProc(const ssiInfo *d, procinfov p)
#define SI_LINK_SET_OPEN_P(l, flag)
void ssiWriteCommand(si_link l, command D)
idhdl enterid(const char *s, int lev, int t, idhdl *root, BOOLEAN init, BOOLEAN search)
BOOLEAN singular_in_batchmode
BOOLEAN ssiSetCurrRing(const ring r)
void ssiWriteString(const ssiInfo *d, const char *s)
const CanonicalForm CFMap CFMap & N
static long p_GetExp(const poly p, const unsigned long iBitmask, const int VarOffset)
get a single variable exponent : the integer VarOffset encodes:
lists ssiReadList(si_link l)
BOOLEAN ssiOpen(si_link l, short flag, leftv u)
The main handler for Singular numbers which are suitable for Singular polynomials.
FILE * myfopen(const char *path, const char *mode)
BOOLEAN slInit(si_link l, char *istr)
int status int void * buf
void s_ungetc(int c, s_buff F)
static FORCE_INLINE char * nCoeffName(const coeffs cf)
procinfov ssiReadProc(const ssiInfo *d)
struct for passing initialization parameters to naInitChar
void ssiWriteIdeal(const ssiInfo *d, int typ, const ideal I)
static int si_max(const int a, const int b)
Induced (Schreyer) ordering.
void PrintS(const char *s)
static BOOLEAN rField_is_Q(const ring r)
leftv ssiRead1(si_link l)
void ssiWriteBigintmat(const ssiInfo *d, bigintmat *v)
char name(const Variable &v)
static unsigned pLength(poly a)
BOOLEAN rEqual(ring r1, ring r2, BOOLEAN qr)
returns TRUE, if r1 equals r2 FALSE, otherwise Equality is determined componentwise, if qr == 1, then qrideal equality is tested, as well
ring rDefault(const coeffs cf, int N, char **n, int ord_size, rRingOrder_t *ord, int *block0, int *block1, int **wvhdl, unsigned long bitmask)
static FORCE_INLINE n_coeffType getCoeffType(const coeffs r)
Returns the type of coeffs domain.
int ssiReservePort(int clients)
void ssiWriteNumber_CF(const ssiInfo *d, const number n, const coeffs cf)
number ssiReadNumber_CF(const ssiInfo *d, const coeffs cf)
void ssiWriteList(si_link l, lists dd)
BOOLEAN ssiGetDump(si_link l)
void rChangeCurrRing(ring r)
void ssiWritePoly(const ssiInfo *d, int typ, poly p)
static BOOLEAN rField_is_Zp(const ring r)
void ssiReadAttrib(leftv res, si_link l)
INLINE_THIS void Init(int l=0)
matrix mpNew(int r, int c)
create a r x c zero-matrix
static void p_Delete(poly *p, const ring r)
ring sBucketGetRing(const sBucket_pt bucket)
Returns bucket ring.
ideal idInit(int idsize, int rank)
initialise an ideal / module
const Variable & v
< [in] a sqrfree bivariate poly
static unsigned long p_SetExp(poly p, const unsigned long e, const unsigned long iBitmask, const int VarOffset)
set a single variable exponent : VarOffset encodes the position in p->exp
int ssiBatch(const char *host, const char *port)
int ssiReadInt(s_buff fich)
#define SI_LINK_SET_RW_OPEN_P(l)
command ssiReadCommand(si_link l)
void ssiWriteIntvec(const ssiInfo *d, intvec *v)
void ssiWritePoly_R(const ssiInfo *d, int typ, poly p, const ring r)
used for all algebraic extensions, i.e., the top-most extension in an extension tower is algebraic ...
char * ssiReadString(const ssiInfo *d)
int blackboxIsCmd(const char *n, int &tok)
used by scanner: returns ROOT_DECL for known types (and the type number in tok)
#define SI_LINK_W_OPEN_P(l)
#define SIPC_MAX_SEMAPHORES
void CleanUp(ring r=currRing)
intvec * ssiReadIntmat(const ssiInfo *d)
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
static FORCE_INLINE void n_WriteFd(number a, const ssiInfo *f, const coeffs r)
io via ssi:
poly sBucketPeek(sBucket_pt b)
static void p_Setm(poly p, const ring r)
bigintmat * ssiReadBigintmat(const ssiInfo *d)
const char * slStatusSsi(si_link l, const char *request)
void ssiWriteRing(ssiInfo *d, const ring r)
poly ssiReadPoly(const ssiInfo *D)
coeffs nFindCoeffByName(char *cf_name)
find an existing coeff by its "CoeffName"
static int ssiReserved_Clients
volatile BOOLEAN ssiToBeClosed_inactive
BOOLEAN slClose(si_link l)
intvec * ssiReadIntvec(const ssiInfo *d)
ideal ssiReadIdeal(const ssiInfo *d)
#define omFreeBin(addr, bin)
int sem_acquired[SIPC_MAX_SEMAPHORES]
s_buff s_open_by_name(const char *n)
char * iiGetLibProcBuffer(procinfo *pi, int part)
static poly p_Init(const ring r, omBin bin)
void Werror(const char *fmt,...)
BOOLEAN ssiPrepClose(si_link l)
#define SI_LINK_OPEN_P(l)
void sig_chld_hdl(int)
additional default signal handler
#define MATELEM(mat, i, j)
1-based access to matrix
blackbox * getBlackboxStuff(const int t)
return the structure to the type given by t
coeffs nInitChar(n_coeffType t, void *parameter)
one-time initialisations for new coeffs in case of an error return NULL