My Project
Loading...
Searching...
No Matches
ssiLink.h File Reference

Go to the source code of this file.

Functions

BOOLEAN ssiOpen (si_link l, short flag, leftv u)
BOOLEAN ssiWrite (si_link l, leftv v)
BOOLEAN ssiWrite2 (si_link l, leftv res, leftv v)
leftv ssiRead1 (si_link l)
leftv ssiRead2 (si_link l, leftv key)
BOOLEAN ssiClose (si_link l)
const char * slStatusSsi (si_link l, const char *request)
si_link_extension slInitSsiExtension (si_link_extension s)
si_link ssiCommandLink ()
void sig_chld_hdl (int sig)
 additional default signal handler
int ssiReservePort (int clients)
void singular_close_links ()
ideal ssiReadIdeal (ssiInfo *d)
void ssiWriteIdeal (const ssiInfo *d, int typ, const ideal I)
int ssiReadInt (const ssiInfo *d)
void ssiWriteInt (const ssiInfo *d, const int i)
char * ssiWritePoly_S (poly p, const ring r)
poly ssiReadPoly_S (char *s, const ring r)
char * ssiWriteIdeal_S (const ideal I, const ring R)
ideal ssiReadIdeal_S (char *s, const ring R)
char * ssiWriteMatrix_S (const matrix M, const ring R)
matrix ssiReadMatrix_S (char *s, const ring R)
char * ssiWriteModule_S (const ideal M, const ring R)
char * ssiWriteRing_S (const ring r)
ring ssiReadRing_S (char *s)
leftv ssiRead1_S (char **s, const ring R)
void ssiWrite_S (leftv v, const ring R)

Function Documentation

◆ sig_chld_hdl()

void sig_chld_hdl ( int sig)

additional default signal handler

some newer Linux version cannot have SIG_IGN for SIGCHLD, so use this nice routine here: SuSe 9.x reports -1 always Redhat 9.x/FC x reports sometimes -1 see also: hpux_system also needed by getrusage (timer etc.)

Parameters
[in]sig

Definition at line 3265 of file ssiLink.cc.

3266{
3267
3268#if 0
3269 pid_t kidpid;
3270 int status;
3271 loop
3272 {
3273 kidpid = si_waitpid(-1, &status, WNOHANG);
3274 if (kidpid==-1)
3275 {
3276 /* continue on interruption (EINTR): */
3277 if (errno == EINTR) continue;
3278 /* break on anything else (EINVAL or ECHILD according to manpage): */
3279 break;
3280 }
3281 else if (kidpid==0) break; /* no more children to process, so break */
3282
3283 //printf("Child %ld terminated\n", kidpid);
3285 while((hh!=NULL)&&(ssiToBeClosed_inactive))
3286 {
3287 if((hh->l!=NULL) && (hh->l->m->Open==ssiOpen))
3288 {
3289 ssiInfo *d = (ssiInfo *)hh->l->data;
3290 if(d->pid==kidpid)
3291 {
3293 {
3295 slClose(hh->l);
3297 break;
3298 }
3299 else break;
3300 }
3301 else hh=(link_list)hh->next;
3302 }
3303 else hh=(link_list)hh->next;
3304 }
3305 }
3306#endif
3307}
#define TRUE
Definition auxiliary.h:101
#define FALSE
Definition auxiliary.h:97
#define NULL
Definition omList.c:12
int * status
Definition si_signals.h:61
#define loop
Definition structs.h:71

◆ singular_close_links()

void singular_close_links ( )

Definition at line 3455 of file ssiLink.cc.

3456{
3458 while(hh!=NULL)
3459 {
3460 if ((hh->l->m!=NULL)
3461 && (hh->l->m->Open==ssiOpen)
3462 && SI_LINK_OPEN_P(hh->l)
3463 && (strcmp(hh->l->mode, "fork")==0))
3464 {
3466 ssiInfo *d = (ssiInfo *)hh->l->data;
3467 if (d->f_read!=NULL) { s_close(d->f_read);d->f_read=NULL;}
3468 if (d->f_write!=NULL) { fclose(d->f_write); d->f_write=NULL; }
3469 }
3470 hh=(link_list)hh->next;
3471 }
3473}
int s_close(s_buff &F)
Definition s_buff.cc:46

◆ slInitSsiExtension()

si_link_extension slInitSsiExtension ( si_link_extension s)

Definition at line 2808 of file ssiLink.cc.

2809{
2810 s->Open=ssiOpen;
2811 s->Close=ssiClose;
2812 s->Kill=ssiClose;
2813 s->Read=ssiRead1;
2814 s->Read2=ssiRead2;
2815 s->Write=ssiWrite;
2816 s->Dump=ssiDump;
2817 s->GetDump=ssiGetDump;
2818
2819 s->Status=slStatusSsi;
2820 s->SetRing=ssiSetRing;
2821 s->type="ssi";
2822 return s;
2823}
const CanonicalForm int s
Definition facAbsFact.cc:51

◆ slStatusSsi()

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

Definition at line 2825 of file ssiLink.cc.

2826{
2827 if (strcmp(l->mode,"string")==0)
2828 {
2829 if (strcmp(request, "read") == 0)
2830 {
2831 if (SI_LINK_R_OPEN_P(l)) return "yes";
2832 else return "no";
2833 }
2834 if (strcmp(request, "write") == 0)
2835 {
2836 if (SI_LINK_W_OPEN_P(l)) return "yes";
2837 else return "no";
2838 }
2839 return "inavlid";
2840 }
2841 ssiInfo *d=(ssiInfo*)l->data;
2842 if (d==NULL)
2843 return "no";
2844 if (((strcmp(l->mode,"fork")==0)
2845 ||(strcmp(l->mode,"tcp")==0)
2846 ||(strcmp(l->mode,"connect")==0))
2847 && (strcmp(request, "read") == 0))
2848 {
2849 if (s_isready(d->f_read)) return "ready";
2850#if defined(HAVE_POLL)
2851 pollfd pfd;
2852 loop
2853 {
2854 /* Don't block. Return socket status immediately. */
2855 pfd.fd=d->fd_read;
2856 pfd.events=POLLIN;
2857 //Print("test fd %d\n",d->fd_read);
2858 /* check with select: chars waiting: no -> not ready */
2859 switch (si_poll(&pfd,1,0))
2860 {
2861 case 0: /* not ready */ return "not ready";
2862 case -1: /*error*/ return "error";
2863 case 1: /*ready ? */ break;
2864 }
2865#else
2866 fd_set mask;
2867 struct timeval wt;
2868 if (FD_SETSIZE<=d->fd_read)
2869 {
2870 Werror("file descriptor number too high (%d)",d->fd_read);
2871 return "error";
2872 }
2873
2874 loop
2875 {
2876 /* Don't block. Return socket status immediately. */
2877 wt.tv_sec = 0;
2878 wt.tv_usec = 0;
2879
2880 FD_ZERO(&mask);
2881 FD_SET(d->fd_read, &mask);
2882 //Print("test fd %d\n",d->fd_read);
2883 /* check with select: chars waiting: no -> not ready */
2884 switch (si_select(d->fd_read+1, &mask, NULL, NULL, &wt))
2885 {
2886 case 0: /* not ready */ return "not ready";
2887 case -1: /*error*/ return "error";
2888 case 1: /*ready ? */ break;
2889 }
2890#endif
2891 /* yes: read 1 char*/
2892 /* if \n, check again with select else ungetc(c), ready*/
2893 int c=s_getc(d->f_read);
2894 //Print("try c=%d\n",c);
2895 if (c== -1) return "eof"; /* eof or error */
2896 else if (isdigit(c))
2897 { s_ungetc(c,d->f_read); return "ready"; }
2898 else if (c>' ')
2899 {
2900 Werror("unknown char in ssiLink(%d)",c);
2901 return "error";
2902 }
2903 /* else: next char */
2904 }
2905 }
2906 else if (strcmp(request, "read") == 0)
2907 {
2908 if (SI_LINK_R_OPEN_P(l) && (!s_iseof(d->f_read)) && (s_isready(d->f_read))) return "ready";
2909 else return "not ready";
2910 }
2911 else if (strcmp(request, "write") == 0)
2912 {
2913 if (SI_LINK_W_OPEN_P(l)) return "ready";
2914 else return "not ready";
2915 }
2916 else return "unknown status request";
2917}
int l
Definition cfEzgcd.cc:100
void Werror(const char *fmt,...)
Definition reporter.cc:189
int s_getc(s_buff F)
Definition s_buff.cc:59
int s_isready(s_buff F)
Definition s_buff.cc:86
int s_iseof(s_buff F)
Definition s_buff.cc:352
void s_ungetc(int c, s_buff F)
Definition s_buff.cc:100

◆ ssiClose()

BOOLEAN ssiClose ( si_link l)

Definition at line 2120 of file ssiLink.cc.

2121{
2122 if (l!=NULL)
2123 {
2125 ssiInfo *d = (ssiInfo *)l->data;
2126 if (d!=NULL)
2127 {
2128 // send quit signal
2129 if ((d->send_quit_at_exit)
2130 && (d->quit_sent==0))
2131 {
2132 fputs("99\n",d->f_write);
2133 fflush(d->f_write);
2134 d->quit_sent=1;
2135 }
2136 // clean ring
2137 if (d->r!=NULL) rKill(d->r);
2138 for(int i=0;i<SI_RING_CACHE;i++)
2139 {
2140 if (d->rings[i]!=NULL) rKill(d->rings[i]);
2141 d->rings[i]=NULL;
2142 }
2143 if (d->f_read!=NULL) { s_close(d->f_read);d->f_read=NULL;}
2144 if (d->f_write!=NULL) { fclose(d->f_write); d->f_write=NULL; }
2145 if (((strcmp(l->mode,"tcp")==0)
2146 || (strcmp(l->mode,"fork")==0))
2147 && (d->pid>1))
2148 {
2149 // did the child stop ?
2150 int pid=si_waitpid(d->pid,NULL,WNOHANG);
2151 if ((pid==0) /* no status change for child*/
2152 && (kill(d->pid,0)==0)) // child is still running
2153 {
2154 struct timespec t;
2155 struct timespec rem;
2156 // wait 60 sec
2157 for(int i=0;i<50;i++)
2158 {
2159 // wait till signal or 100ms:
2160 t.tv_sec=0;
2161 t.tv_nsec=100000000; // <=100 ms
2162 nanosleep(&t, &rem);
2163 // child finished ?
2164 if (si_waitpid(d->pid,NULL,WNOHANG) == d->pid) break;
2165 }
2166 if (kill(d->pid,0)==0) // child still exists
2167 {
2168 kill(d->pid,SIGTERM);
2169 t.tv_sec=1;
2170 t.tv_nsec=0; // <=1000 ms
2171 nanosleep(&t, &rem);
2172 si_waitpid(d->pid,NULL,WNOHANG);
2173 }
2174 }
2175 }
2176 if ((strcmp(l->mode,"tcp")==0)
2177 || (strcmp(l->mode,"fork")==0))
2178 {
2180 if (hh!=NULL)
2181 {
2182 if (hh->l==l)
2183 {
2185 omFreeSize(hh,sizeof(link_struct));
2186 }
2187 else while(hh->next!=NULL)
2188 {
2189 link_list hhh=(link_list)hh->next;
2190 if (hhh->l==l)
2191 {
2192 hh->next=hhh->next;
2193 omFreeSize(hhh,sizeof(link_struct));
2194 break;
2195 }
2196 else
2197 hh=(link_list)hh->next;
2198 }
2199 }
2200 }
2201 omFreeSize((ADDRESS)d,(sizeof *d));
2202 }
2203 l->data=NULL;
2204 }
2205 return FALSE;
2206}
void * ADDRESS
Definition auxiliary.h:120
int i
Definition cfEzgcd.cc:132
void rKill(ring r)
Definition ipshell.cc:6181
void rem(unsigned long *a, unsigned long *q, unsigned long p, int &dega, int degq)
Definition minpoly.cc:572
#define omFreeSize(addr, size)
#define SI_RING_CACHE
Definition s_buff.h:30

◆ ssiCommandLink()

si_link ssiCommandLink ( )

Definition at line 3194 of file ssiLink.cc.

3195{
3196 if (ssiReserved_P==0)
3197 {
3198 WerrorS("ERROR no reserved port requested");
3199 return NULL;
3200 }
3201 struct sockaddr_in cli_addr;
3202 int clilen = sizeof(cli_addr);
3203 int newsockfd = si_accept(ssiReserved_sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
3204 if(newsockfd < 0)
3205 {
3206 Werror("ERROR on accept (errno=%d)",errno);
3207 return NULL;
3208 }
3210 si_link_extension s = si_link_root;
3211 si_link_extension prev = s;
3212 while (strcmp(s->type, "ssi") != 0)
3213 {
3214 if (s->next == NULL)
3215 {
3216 prev = s;
3217 s = NULL;
3218 break;
3219 }
3220 else
3221 {
3222 s = s->next;
3223 }
3224 }
3225 if (s != NULL)
3226 l->m = s;
3227 else
3228 {
3229 si_link_extension ns = (si_link_extension)omAlloc0Bin(s_si_link_extension_bin);
3230 prev->next=slInitSsiExtension(ns);
3231 l->m = prev->next;
3232 }
3233 l->name=omStrDup("");
3234 l->mode=omStrDup("tcp");
3235 l->ref=1;
3236 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo));
3237 l->data=d;
3238 d->fd_read = newsockfd;
3239 d->fd_write = newsockfd;
3240 d->f_read = s_open(newsockfd);
3241 d->f_write = fdopen(newsockfd, "w");
3244 if (ssiReserved_Clients<=0)
3245 {
3246 ssiReserved_P=0;
3247 si_close(ssiReserved_sockfd);
3248 }
3249 return l;
3250}
void WerrorS(const char *s)
Definition feFopen.cc:24
#define omStrDup(s)
#define omAlloc0Bin(bin)
#define omAlloc0(size)
s_buff s_open(int fd)
Definition s_buff.cc:32
int fd_write
Definition s_buff.h:26
s_buff f_read
Definition s_buff.h:22
FILE * f_write
Definition s_buff.h:23
int fd_read
Definition s_buff.h:26

◆ ssiOpen()

BOOLEAN ssiOpen ( si_link l,
short flag,
leftv u )

Definition at line 1647 of file ssiLink.cc.

1648{
1649 if (l!=NULL)
1650 {
1651 const char *mode;
1652 if (flag & SI_LINK_OPEN)
1653 {
1654 if (strcmp(l->mode, "r") == 0)
1655 flag = SI_LINK_READ;
1656 else if (strcmp(l->mode,"string")==0)
1657 {
1659 return FALSE;
1660 }
1661 else flag = SI_LINK_WRITE;
1662 }
1663 if (((flag == SI_LINK_READ)
1664 || (flag == SI_LINK_WRITE))
1665 && (strcmp(l->mode,"string")==0))
1666 {
1668 return FALSE;
1669 }
1670
1671 if (flag == SI_LINK_READ) mode = "r";
1672 else if (strcmp(l->mode, "w") == 0) mode = "w";
1673 else if (strcmp(l->mode, "fork") == 0) mode = "fork";
1674 else if (strcmp(l->mode, "tcp") == 0) mode = "tcp";
1675 else if (strcmp(l->mode, "connect") == 0) mode = "connect";
1676 else mode = "a";
1677
1678
1679 SI_LINK_SET_OPEN_P(l, flag);
1680 if(l->data!=NULL) omFreeSize(l->data,sizeof(ssiInfo));
1681 omFreeBinAddr(l->mode);
1682 l->mode = omStrDup(mode);
1683
1684 ssiInfo *d=(ssiInfo*)omAlloc0(sizeof(ssiInfo));
1685 l->data=d;
1686 if (l->name[0] == '\0')
1687 {
1688 if (strcmp(mode,"fork")==0)
1689 {
1690 int cpus = (long) feOptValue(FE_OPT_CPUS);
1691 if (cpus<1)
1692 {
1693 WerrorS("no sub-processes allowed");
1694 l->flags=0;
1695 l->data=NULL;
1696 omFreeSize(d,sizeof(ssiInfo));
1697 return TRUE;
1698 }
1699 int pc[2];
1700 int cp[2];
1701 int err1=pipe(pc);
1702 int err2=pipe(cp);
1703 if (err1 || err2)
1704 {
1705 Werror("pipe failed with %d\n",errno);
1706 l->flags=0;
1707 l->data=NULL;
1708 omFreeSize(d,sizeof(ssiInfo));
1709 return TRUE;
1710 }
1712 n->u=u;
1713 n->l=l;
1714 n->next=(void *)ssiToBeClosed;
1715 ssiToBeClosed=n;
1716
1717 pid_t pid = fork();
1718 if (pid == -1 && errno == EAGAIN) // RLIMIT_NPROC too low?
1719 {
1721 pid = fork();
1722 }
1723 if (pid == -1)
1724 {
1725 WerrorS("could not fork");
1726 l->flags=0;
1727 l->data=NULL;
1728 omFreeSize(d,sizeof(ssiInfo));
1729 return TRUE;
1730 }
1731 if (pid==0) /*fork: child*/
1732 {
1733 /* block SIGINT */
1734 sigset_t sigint;
1735 sigemptyset(&sigint);
1736 sigaddset(&sigint, SIGINT);
1737 sigprocmask(SIG_BLOCK, &sigint, NULL);
1738 si_set_signal(SIGTERM,sig_term_hdl);
1739 /* set #cpu to 1 for the child:*/
1740 feSetOptValue(FE_OPT_CPUS,1);
1741
1743 /* we know: l is the first entry in ssiToBeClosed-list */
1744 while(hh!=NULL)
1745 {
1746 SI_LINK_SET_CLOSE_P(hh->l);
1747 ssiInfo *dd=(ssiInfo*)hh->l->data;
1748 s_close(dd->f_read);
1749 fclose(dd->f_write);
1750 if (dd->r!=NULL) rKill(dd->r);
1751 omFreeSize((ADDRESS)dd,(sizeof *dd));
1752 hh->l->data=NULL;
1753 link_list nn=(link_list)hh->next;
1754 omFree(hh);
1755 hh=nn;
1756 }
1757 ssiToBeClosed->next=NULL;
1758#ifdef HAVE_SIMPLEIPC
1759 memset(sem_acquired, 0, SIPC_MAX_SEMAPHORES*sizeof(sem_acquired[0]));
1760#endif // HAVE_SIMPLEIPC
1761 si_close(pc[1]); si_close(cp[0]);
1762 d->f_write=fdopen(cp[1],"w");
1763 d->f_read=s_open(pc[0]);
1764 d->fd_read=pc[0];
1765 d->fd_write=cp[1];
1766 //d->r=currRing;
1767 //if (d->r!=NULL) d->r->ref++;
1768 l->data=d;
1769 omFreeBinAddr(l->mode);
1770 l->mode = omStrDup(mode);
1773 //myynest=0;
1775 if ((u!=NULL)&&(u->rtyp==IDHDL))
1776 {
1777 idhdl h=(idhdl)u->data;
1778 h->lev=0;
1779 }
1780 loop
1781 {
1782 if (!SI_LINK_OPEN_P(l)) m2_end(-1);
1783 if(d->f_read->is_eof) m2_end(-1);
1784 leftv h=ssiRead1(l); /*contains an exit.... */
1785 if (feErrors != NULL && *feErrors != '\0')
1786 {
1787 // handle errors:
1788 PrintS(feErrors); /* currently quite simple */
1789 *feErrors = '\0';
1790 }
1791 ssiWrite(l,h);
1792 h->CleanUp();
1794 }
1795 /* never reached*/
1796 }
1797 else if (pid>0) /*fork: parent*/
1798 {
1799 d->pid=pid;
1800 si_close(pc[0]); si_close(cp[1]);
1801 d->f_write=fdopen(pc[1],"w");
1802 d->f_read=s_open(cp[0]);
1803 d->fd_read=cp[0];
1804 d->fd_write=pc[1];
1806 d->send_quit_at_exit=1;
1807 //d->r=currRing;
1808 //if (d->r!=NULL) d->r->ref++;
1809 }
1810 else
1811 {
1812 Werror("fork failed (%d)",errno);
1813 l->data=NULL;
1814 omFreeSize(d,sizeof(ssiInfo));
1815 return TRUE;
1816 }
1817 }
1818 // ---------------------------------------------------------------------
1819 else if (strcmp(mode,"tcp")==0)
1820 {
1821 int sockfd, newsockfd, portno, clilen;
1822 struct sockaddr_in serv_addr, cli_addr;
1823 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1824 if(sockfd < 0)
1825 {
1826 WerrorS("ERROR opening socket");
1827 l->data=NULL;
1828 l->flags=0;
1829 omFreeSize(d,sizeof(ssiInfo));
1830 return TRUE;
1831 }
1832 memset((char *) &serv_addr,0, sizeof(serv_addr));
1833 portno = 1025;
1834 serv_addr.sin_family = AF_INET;
1835 serv_addr.sin_addr.s_addr = INADDR_ANY;
1836 do
1837 {
1838 portno++;
1839 serv_addr.sin_port = htons(portno);
1840 if(portno > 50000)
1841 {
1842 WerrorS("ERROR on binding (no free port available?)");
1843 l->data=NULL;
1844 l->flags=0;
1845 omFreeSize(d,sizeof(ssiInfo));
1846 return TRUE;
1847 }
1848 }
1849 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1850 Print("waiting on port %d\n", portno);mflush();
1851 listen(sockfd,1);
1852 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1853 if(newsockfd < 0)
1854 {
1855 WerrorS("ERROR on accept");
1856 l->data=NULL;
1857 l->flags=0;
1858 omFreeSize(d,sizeof(ssiInfo));
1859 return TRUE;
1860 }
1861 PrintS("client accepted\n");
1862 d->fd_read = newsockfd;
1863 d->fd_write = newsockfd;
1864 d->f_read = s_open(newsockfd);
1865 d->f_write = fdopen(newsockfd, "w");
1867 si_close(sockfd);
1868 }
1869 // no ssi-Link on stdin or stdout
1870 else if (strcmp(mode,"string")==0)
1871 {
1873 }
1874 else
1875 {
1876 Werror("invalid mode >>%s<< for ssi",mode);
1877 l->data=NULL;
1878 l->flags=0;
1879 omFreeSize(d,sizeof(ssiInfo));
1880 return TRUE;
1881 }
1882 }
1883 // =========================================================================
1884 else /*now l->name!=NULL*/
1885 {
1886 // tcp mode
1887 if(strcmp(mode,"tcp")==0)
1888 {
1889 int sockfd, newsockfd, portno, clilen;
1890 struct sockaddr_in serv_addr, cli_addr;
1891 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1892 if(sockfd < 0)
1893 {
1894 WerrorS("ERROR opening socket");
1895 l->data=NULL;
1896 l->flags=0;
1897 omFreeSize(d,sizeof(ssiInfo));
1898 return TRUE;
1899 }
1900 memset((char *) &serv_addr,0, sizeof(serv_addr));
1901 portno = 1025;
1902 serv_addr.sin_family = AF_INET;
1903 serv_addr.sin_addr.s_addr = INADDR_ANY;
1904 do
1905 {
1906 portno++;
1907 serv_addr.sin_port = htons(portno);
1908 if(portno > 50000)
1909 {
1910 WerrorS("ERROR on binding (no free port available?)");
1911 l->data=NULL;
1912 l->flags=0;
1913 omFreeSize(d,sizeof(ssiInfo));
1914 return TRUE;
1915 }
1916 }
1917 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1918 //Print("waiting on port %d\n", portno);mflush();
1919 listen(sockfd,1);
1920 char* cli_host = (char*)omAlloc(256);
1921 char* path = (char*)omAlloc(1024);
1922 int r = si_sscanf(l->name,"%255[^:]:%s",cli_host,path);
1923 if(r == 0)
1924 {
1925 WerrorS("ERROR: no host specified");
1926 l->data=NULL;
1927 l->flags=0;
1928 omFreeSize(d,sizeof(ssiInfo));
1929 omFree(path);
1930 omFree(cli_host);
1931 return TRUE;
1932 }
1933 else if(r == 1)
1934 {
1935 WarnS("program not specified, using /usr/local/bin/Singular");
1936 Warn("in line >>%s<<",my_yylinebuf);
1937 strcpy(path,"/usr/local/bin/Singular");
1938 }
1939 char* ssh_command = (char*)omAlloc(256);
1940 char* ser_host = (char*)omAlloc(64);
1941 if(strcmp(cli_host,"localhost")==0)
1942 strcpy(ser_host,"localhost");
1943 else
1944 gethostname(ser_host,64);
1945 if (strcmp(cli_host,"localhost")==0) /*avoid "ssh localhost" as key may change*/
1946 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1947 else
1948 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1949 //Print("client on %s started:%s\n",cli_host,path);
1950 omFree(path);
1951 omFree(cli_host);
1952 if (TEST_OPT_PROT) { Print("running >>%s<<\n",ssh_command); }
1953 int re=system(ssh_command);
1954 if (re<0)
1955 {
1956 Werror("ERROR running `%s` (%d)",ssh_command,re);
1957 l->data=NULL;
1958 l->flags=0;
1959 omFreeSize(d,sizeof(ssiInfo));
1960 return TRUE;
1961 }
1962 omFree(ssh_command);
1963 omFree(ser_host);
1964 clilen = sizeof(cli_addr);
1965 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1966 if(newsockfd < 0)
1967 {
1968 WerrorS("ERROR on accept");
1969 l->data=NULL;
1970 l->flags=0;
1971 omFreeSize(d,sizeof(ssiInfo));
1972 return TRUE;
1973 }
1974 //PrintS("client accepted\n");
1975 d->fd_read = newsockfd;
1976 d->fd_write = newsockfd;
1977 d->f_read = s_open(newsockfd);
1978 d->f_write = fdopen(newsockfd, "w");
1979 si_close(sockfd);
1981 d->send_quit_at_exit=1;
1982 link_list newlink=(link_list)omAlloc(sizeof(link_struct));
1983 newlink->u=u;
1984 newlink->l=l;
1985 newlink->next=(void *)ssiToBeClosed;
1986 ssiToBeClosed=newlink;
1987 fprintf(d->f_write,"98 %d %d %u %u\n",SSI_VERSION,MAX_TOK,si_opt_1,si_opt_2);
1988 }
1989 // ----------------------------------------------------------------------
1990 else if(strcmp(mode,"connect")==0)
1991 {
1992 char* host = (char*)omAlloc(256);
1993 int sockfd, portno;
1994 struct sockaddr_in serv_addr;
1995 struct hostent *server;
1996
1997 si_sscanf(l->name,"%255[^:]:%d",host,&portno);
1998 //Print("connect to host %s, port %d\n",host,portno);mflush();
1999 if (portno!=0)
2000 {
2001 sockfd = socket(AF_INET, SOCK_STREAM, 0);
2002 if (sockfd < 0)
2003 {
2004 WerrorS("ERROR opening socket");
2005 l->flags=0;
2006 l->data=NULL;
2007 omFreeSize(d,sizeof(ssiInfo));
2008 return TRUE;
2009 }
2010 server = gethostbyname(host);
2011 if (server == NULL)
2012 {
2013 WerrorS("ERROR, no such host");
2014 l->flags=0;
2015 l->data=NULL;
2016 omFreeSize(d,sizeof(ssiInfo));
2017 return TRUE;
2018 }
2019 memset((char *) &serv_addr, 0, sizeof(serv_addr));
2020 serv_addr.sin_family = AF_INET;
2021 memcpy((char *)&serv_addr.sin_addr.s_addr,
2022 (char *)server->h_addr,
2023 server->h_length);
2024 serv_addr.sin_port = htons(portno);
2025 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
2026 {
2027 Werror("ERROR connecting(errno=%d)",errno);
2028 l->flags=0;
2029 l->data=NULL;
2030 omFreeSize(d,sizeof(ssiInfo));
2031 return TRUE;
2032 }
2033 //PrintS("connected\n");mflush();
2034 d->f_read=s_open(sockfd);
2035 d->fd_read=sockfd;
2036 d->f_write=fdopen(sockfd,"w");
2037 d->fd_write=sockfd;
2039 omFree(host);
2040 }
2041 else
2042 {
2043 l->data=NULL;
2044 l->flags=0;
2045 omFreeSize(d,sizeof(ssiInfo));
2046 return TRUE;
2047 }
2048 }
2049 // ======================================================================
2050 else
2051 {
2052 // normal link to a file
2053 if (FE_OPT_NO_SHELL_FLAG) {WerrorS("no links allowed");return TRUE;}
2054 FILE *outfile;
2055 char *filename=l->name;
2056
2057 if(filename[0]=='>')
2058 {
2059 if (filename[1]=='>')
2060 {
2061 filename+=2;
2062 mode = "a";
2063 }
2064 else
2065 {
2066 filename++;
2067 mode="w";
2068 }
2069 }
2070 outfile=myfopen(filename,mode);
2071 if (outfile!=NULL)
2072 {
2073 if (strcmp(l->mode,"r")==0)
2074 {
2075 fclose(outfile);
2076 d->f_read=s_open_by_name(filename);
2077 }
2078 else
2079 {
2080 d->f_write = outfile;
2081 fprintf(d->f_write,"98 %d %d %u %u\n",SSI_VERSION,MAX_TOK,si_opt_1,si_opt_2);
2082 }
2083 }
2084 else
2085 {
2086 omFree(d);
2087 l->data=NULL;
2088 l->flags=0;
2089 return TRUE;
2090 }
2091 }
2092 }
2093 }
2094
2095 return FALSE;
2096}
int rtyp
Definition subexpr.h:91
void * data
Definition subexpr.h:88
VAR BOOLEAN singular_in_batchmode
Definition cntrlc.cc:62
si_hdl_typ si_set_signal(int sig, si_hdl_typ signal_handler)
meta function for binding a signal to an handler
Definition cntrlc.cc:121
void sig_term_hdl(int)
Definition cntrlc.cc:77
#define Print
Definition emacs.cc:80
#define Warn
Definition emacs.cc:77
#define WarnS
Definition emacs.cc:78
EXTERN_VAR BOOLEAN FE_OPT_NO_SHELL_FLAG
Definition extra.cc:166
FILE * myfopen(const char *path, const char *mode)
Definition feFopen.cc:167
const char * feSetOptValue(feOptIndex opt, char *optarg)
Definition feOpt.cc:154
static void * feOptValue(feOptIndex opt)
Definition feOpt.h:40
VAR char my_yylinebuf[80]
Definition febase.cc:44
char * fe_fgets_dummy(const char *, char *, int)
Definition feread.cc:455
char *(* fe_fgets_stdin)(const char *pr, char *s, int size)
Definition feread.cc:32
EXTERN_VAR omBin sleftv_bin
Definition ipid.h:145
STATIC_VAR Poly * h
Definition janet.cc:971
void m2_end(int i)
Definition misc_ip.cc:1106
#define omAlloc(size)
#define omFree(addr)
#define omFreeBin(addr, bin)
#define omFreeBinAddr(addr)
VAR unsigned si_opt_2
Definition options.c:6
VAR unsigned si_opt_1
Definition options.c:5
#define TEST_OPT_PROT
Definition options.h:105
void PrintS(const char *s)
Definition reporter.cc:288
VAR char * feErrors
Definition reporter.cc:47
#define mflush()
Definition reporter.h:58
idrec * idhdl
Definition ring.h:22
int raise_rlimit_nproc()
Definition rlimit.c:18
s_buff s_open_by_name(const char *n)
Definition s_buff.cc:40
pid_t pid
Definition s_buff.h:25
char send_quit_at_exit
Definition s_buff.h:28
VAR int sem_acquired[SIPC_MAX_SEMAPHORES]
Definition semaphore.c:25
#define SIPC_MAX_SEMAPHORES
Definition simpleipc.h:10
sleftv * leftv
Definition structs.h:53
#define IDHDL
Definition tok.h:31
@ MAX_TOK
Definition tok.h:220

◆ ssiRead1()

leftv ssiRead1 ( si_link l)

Definition at line 2209 of file ssiLink.cc.

2210{
2211 ssiInfo *d = (ssiInfo *)l->data;
2213 int t=0;
2214 t=s_readint(d->f_read);
2215 //Print("got type %d\n",t);
2216 switch(t)
2217 {
2218 case 1:res->rtyp=INT_CMD;
2219 res->data=(char *)(long)ssiReadInt(d);
2220 //Print("int: %d\n",(int)(long)res->data);
2221 break;
2222 case 2:res->rtyp=STRING_CMD;
2223 res->data=(char *)ssiReadString(d);
2224 //Print("str: %s\n",(char*)res->data);
2225 break;
2226 case 3:res->rtyp=NUMBER_CMD;
2227 if (d->r==NULL) goto no_ring;
2228 ssiCheckCurrRing(d->r);
2229 res->data=(char *)ssiReadNumber(d);
2230 //Print("number\n");
2231 break;
2232 case 4:res->rtyp=BIGINT_CMD;
2233 res->data=(char *)ssiReadBigInt(d);
2234 //Print("bigint\n");
2235 break;
2236 case 15:
2237 case 5:{
2238 //Print("ring %d\n",t);
2239 d->r=ssiReadRing(d);
2240 if (errorreported) return NULL;
2241 res->data=(char*)d->r;
2242 if (d->r!=NULL) rIncRefCnt(d->r);
2243 res->rtyp=RING_CMD;
2244 if (t==15) // setring
2245 {
2246 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
2248 return ssiRead1(l);
2249 }
2250 }
2251 break;
2252 case 6:res->rtyp=POLY_CMD;
2253 //Print("poly\n");
2254 if (d->r==NULL) goto no_ring;
2255 ssiCheckCurrRing(d->r);
2256 res->data=(char*)ssiReadPoly(d);
2257 break;
2258 case 7:res->rtyp=IDEAL_CMD;
2259 //Print("ideal\n");
2260 if (d->r==NULL) goto no_ring;
2261 ssiCheckCurrRing(d->r);
2262 res->data=(char*)ssiReadIdeal(d);
2263 break;
2264 case 8:res->rtyp=MATRIX_CMD;
2265 //Print("matrix\n");
2266 if (d->r==NULL) goto no_ring;
2267 ssiCheckCurrRing(d->r);
2268 res->data=(char*)ssiReadMatrix(d);
2269 break;
2270 case 9:res->rtyp=VECTOR_CMD;
2271 //Print("vector\n");
2272 if (d->r==NULL) goto no_ring;
2273 ssiCheckCurrRing(d->r);
2274 res->data=(char*)ssiReadPoly(d);
2275 break;
2276 case 10:
2277 case 22:if (t==22) res->rtyp=SMATRIX_CMD;
2278 else res->rtyp=MODUL_CMD;
2279 //Print("module/smatrix %d\n",t);
2280 if (d->r==NULL) goto no_ring;
2281 ssiCheckCurrRing(d->r);
2282 {
2283 int rk=s_readint(d->f_read);
2284 ideal M=ssiReadIdeal(d);
2285 M->rank=rk;
2286 res->data=(char*)M;
2287 }
2288 break;
2289 case 11:
2290 {
2291 //Print("cmd\n",t);
2292 res->rtyp=COMMAND;
2293 res->data=ssiReadCommand(l);
2294 int nok=res->Eval();
2295 if (nok) WerrorS("error in eval");
2296 break;
2297 }
2298 case 12: /*DEF_CMD*/
2299 {
2300 //Print("def\n",t);
2301 res->rtyp=0;
2302 res->name=(char *)ssiReadString(d);
2303 int nok=res->Eval();
2304 if (nok) WerrorS("error in name lookup");
2305 break;
2306 }
2307 case 13: res->rtyp=PROC_CMD;
2308 res->data=ssiReadProc(d);
2309 break;
2310 case 14: res->rtyp=LIST_CMD;
2311 res->data=ssiReadList(l);
2312 break;
2313 case 16: res->rtyp=NONE; res->data=NULL;
2314 break;
2315 case 17: res->rtyp=INTVEC_CMD;
2316 res->data=ssiReadIntvec(d);
2317 break;
2318 case 18: res->rtyp=INTMAT_CMD;
2319 res->data=ssiReadIntmat(d);
2320 break;
2321 case 19: res->rtyp=BIGINTMAT_CMD;
2322 res->data=ssiReadBigintmat(d);
2323 break;
2324 case 20: ssiReadBlackbox(res,l);
2325 break;
2326 case 21: ssiReadAttrib(res,l);
2327 break;
2328 case 23: ssiReadRingProperties(l);
2329 return ssiRead1(l);
2330 break;
2331 case 24: res->rtyp=BIGINTVEC_CMD;
2332 res->data=ssiReadBigintvec(d);
2333 break;
2334 // ------------
2335 case 98: // version
2336 {
2337 int n98_v,n98_m;
2338 BITSET n98_o1,n98_o2;
2339 n98_v=s_readint(d->f_read);
2340 n98_m=s_readint(d->f_read);
2341 n98_o1=s_readint(d->f_read);
2342 n98_o2=s_readint(d->f_read);
2343 if ((n98_v!=SSI_VERSION) ||(n98_m!=MAX_TOK))
2344 {
2345 Print("incompatible versions of ssi: %d/%d vs %d/%d\n",
2346 SSI_VERSION,MAX_TOK,n98_v,n98_m);
2347 }
2348 #ifndef SING_NDEBUG
2349 if (TEST_OPT_DEBUG)
2350 Print("// opening ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
2351 #endif
2352 si_opt_1=n98_o1;
2353 si_opt_2=n98_o2;
2355 return ssiRead1(l);
2356 }
2357 case 99: omFreeBin(res,sleftv_bin); ssiClose(l); m2_end(-1);
2358 break; /*to make compiler happy*/
2359 case 0: if (s_iseof(d->f_read))
2360 {
2361 ssiClose(l);
2362 }
2363 res->rtyp=DEF_CMD;
2364 break;
2365 default: Werror("not implemented (t:%d)",t);
2367 res=NULL;
2368 break;
2369 }
2370 // if currRing is required for the result, but lost
2371 // define "ssiRing%d" as currRing:
2372 if ((d->r!=NULL)
2373 && (currRing!=d->r)
2374 && (res->RingDependend()))
2375 {
2376 if(ssiSetCurrRing(d->r)) { d->r=currRing; }
2377 }
2378 return res;
2379no_ring: WerrorS("no ring");
2381 return NULL;
2382}
#define BITSET
Definition auxiliary.h:85
CanonicalForm res
Definition facAbsFact.cc:60
VAR short errorreported
Definition feFopen.cc:23
@ IDEAL_CMD
Definition grammar.cc:285
@ MATRIX_CMD
Definition grammar.cc:287
@ BIGINTMAT_CMD
Definition grammar.cc:278
@ PROC_CMD
Definition grammar.cc:281
@ INTMAT_CMD
Definition grammar.cc:280
@ MODUL_CMD
Definition grammar.cc:288
@ SMATRIX_CMD
Definition grammar.cc:292
@ VECTOR_CMD
Definition grammar.cc:293
@ BIGINTVEC_CMD
Definition grammar.cc:279
@ NUMBER_CMD
Definition grammar.cc:289
@ POLY_CMD
Definition grammar.cc:290
@ RING_CMD
Definition grammar.cc:282
#define TEST_OPT_DEBUG
Definition options.h:110
VAR ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition polys.cc:13
static ring rIncRefCnt(ring r)
Definition ring.h:854
int s_readint(s_buff F)
Definition s_buff.cc:113
#define M
Definition sirandom.c:25
@ BIGINT_CMD
Definition tok.h:38
@ LIST_CMD
Definition tok.h:118
@ INTVEC_CMD
Definition tok.h:101
@ DEF_CMD
Definition tok.h:58
@ STRING_CMD
Definition tok.h:187
@ INT_CMD
Definition tok.h:96
#define NONE
Definition tok.h:223
#define COMMAND
Definition tok.h:29

◆ ssiRead1_S()

leftv ssiRead1_S ( char ** s,
const ring R )

Definition at line 2383 of file ssiLink.cc.

2384{
2386 int t=0;
2387 t=s_readint_S(s);
2388 switch(t)
2389 {
2390 case 1:res->rtyp=INT_CMD;
2391 res->data=(char *)(long)ssiReadInt_S(s);
2392 break;
2393 case 2:res->rtyp=STRING_CMD;
2394 res->data=(char *)ssiReadString_S(s);
2395 break;
2396 case 3:res->rtyp=NUMBER_CMD;
2397 res->data=(char *)ssiReadNumber_CF_S(s,R->cf);
2398 break;
2399 case 4:res->rtyp=BIGINT_CMD;
2400 res->data=(char *)ssiReadBigInt_S(s);
2401 //Print("bigint\n");
2402 break;
2403 case 15:
2404 case 5:{
2405 //Print("ring %d\n",t);
2406 ring r=ssiReadRing_R_S(s);
2407 if (errorreported||(r==NULL)) return NULL;
2408 res->rtyp=RING_CMD;
2409 res->data=(char*)r;
2410 if (/*(t==15)&&*/
2411 ((currRing==NULL)||(!rSamePolyRep(r,currRing))))
2412 {
2413 rChangeCurrRing(r);
2414 }
2415 break;
2416 }
2417 case 6:res->rtyp=POLY_CMD;
2418 res->data=(char*)ssiReadPoly_R_S(s,R);
2419 break;
2420 case 7:res->rtyp=IDEAL_CMD;
2421 res->data=(char*)ssiReadIdeal_R_S(s,R);
2422 break;
2423 case 8:res->rtyp=MATRIX_CMD;
2424 res->data=(char*)ssiReadMatrix_R_S(s,R);
2425 break;
2426 case 9:res->rtyp=VECTOR_CMD;
2427 res->data=(char*)ssiReadPoly_R_S(s,R);
2428 break;
2429 case 10:
2430 case 22:if (t==22) res->rtyp=SMATRIX_CMD;
2431 else res->rtyp=MODUL_CMD;
2432 {
2433 int rk=s_readint_S(s);
2434 ideal M=ssiReadIdeal_R_S(s,R);
2435 M->rank=rk;
2436 res->data=(char*)M;
2437 }
2438 break;
2439 #if 0
2440 case 11:
2441 {
2442 res->rtyp=COMMAND;
2443 res->data=ssiReadCommand(l);
2444 int nok=res->Eval();
2445 if (nok) WerrorS("error in eval");
2446 break;
2447 }
2448 #endif
2449 case 12: /*DEF_CMD*/
2450 {
2451 res->rtyp=0;
2452 res->name=(char *)ssiReadString_S(s);
2453 int nok=res->Eval();
2454 if (nok) WerrorS("error in name lookup");
2455 break;
2456 }
2457 case 13: res->rtyp=PROC_CMD;
2458 res->data=ssiReadProc_S(s);
2459 break;
2460 case 14: res->rtyp=LIST_CMD;
2461 res->data=ssiReadList_S(s,R);
2462 break;
2463 case 16: res->rtyp=NONE; res->data=NULL;
2464 break;
2465 case 17: res->rtyp=INTVEC_CMD;
2466 res->data=ssiReadIntvec_S(s);
2467 break;
2468 case 18: res->rtyp=INTMAT_CMD;
2469 res->data=ssiReadIntmat_S(s);
2470 break;
2471 case 19: res->rtyp=BIGINTMAT_CMD;
2472 res->data=ssiReadBigintmat_S(s);
2473 break;
2474 #if 0
2475 case 20: ssiReadBlackbox(res,l);
2476 break;
2477 case 21: ssiReadAttrib(res,l);
2478 break;
2479 case 23: ssiReadRingProperties(l);
2480 return ssiRead1(l);
2481 break;
2482 #endif
2483 case 24: res->rtyp=BIGINTVEC_CMD;
2484 res->data=ssiReadBigintvec_S(s);
2485 break;
2486 // ------------
2487 case 98: // version
2488 {
2489 int n98_v,n98_m;
2490 BITSET n98_o1,n98_o2;
2491 n98_v=s_readint_S(s);
2492 n98_m=s_readint_S(s);
2493 n98_o1=s_readint_S(s);
2494 n98_o2=s_readint_S(s);
2495 Print("// version ssi-%d, MAX_TOK=%d\n",n98_v,n98_m);
2496 si_opt_1=n98_o1;
2497 si_opt_2=n98_o2;
2499 return ssiRead1_S(s,R);
2500 }
2501 #if 0
2502 case 99: omFreeBin(res,sleftv_bin); ssiClose(l); m2_end(-1);
2503 break; /*to make compiler happy*/
2504 #endif
2505 case 0: res->rtyp=DEF_CMD;
2506 **s='\0'; /* unkown char?*/
2507 break;
2508 default: Werror("not implemented (t:%d)",t);
2510 res=NULL;
2511 break;
2512 }
2513 while((**s!='\0') &&(**s<=' ')) (*s)++;
2514 if (**s>' ') res->next=ssiRead1_S(s,R);
2515 return res;
2516}
void rChangeCurrRing(ring r)
Definition polys.cc:16
BOOLEAN rSamePolyRep(ring r1, ring r2)
returns TRUE, if r1 and r2 represents the monomials in the same way FALSE, otherwise this is an analo...
Definition ring.cc:1805
int s_readint_S(char **s)
Definition s_buff.cc:141
#define R
Definition sirandom.c:27

◆ ssiRead2()

leftv ssiRead2 ( si_link l,
leftv key )

Definition at line 3488 of file ssiLink.cc.

3489{
3490 if((strcmp(l->mode,"string")==0)
3491 &&(u->Typ()==STRING_CMD))
3492 {
3493 char *s=(char*)u->Data();
3494 return ssiRead1_S(&s,currRing);
3495 }
3496 return NULL;
3497}

◆ ssiReadIdeal()

ideal ssiReadIdeal ( ssiInfo * d)

Definition at line 1319 of file ssiLink.cc.

1320{
1321 return ssiReadIdeal_R(d,d->r);
1322}
ring r
Definition s_buff.h:24

◆ ssiReadIdeal_S()

ideal ssiReadIdeal_S ( char * s,
const ring R )

Definition at line 1324 of file ssiLink.cc.

1325{
1326 return ssiReadIdeal_R_S(&s,R);
1327}

◆ ssiReadInt()

int ssiReadInt ( const ssiInfo * d)

Definition at line 787 of file ssiLink.cc.

788{
789 return s_readint(d->f_read);
790}

◆ ssiReadMatrix_S()

matrix ssiReadMatrix_S ( char * s,
const ring R )

◆ ssiReadPoly_S()

poly ssiReadPoly_S ( char * s,
const ring r )

Definition at line 1288 of file ssiLink.cc.

1289{
1290 return ssiReadPoly_R_S(&s,r);
1291}

◆ ssiReadRing_S()

ring ssiReadRing_S ( char * s)

Definition at line 1168 of file ssiLink.cc.

1169{
1170 ring r=ssiReadRing_R_S(&s);
1171 // check if such ring already exist as ssiRing*
1172 char name[20];
1173 int nr=0;
1174 idhdl h=NULL;
1175 loop // already defined?
1176 {
1177 snprintf(name,20,"ssiRing%d",nr); nr++;
1178 h=IDROOT->get(name, 0);
1179 if (h==NULL)
1180 {
1181 break;
1182 }
1183 else if ((IDTYP(h)==RING_CMD)
1184 && (r!=IDRING(h))
1185 && (rEqual(r,IDRING(h),1)))
1186 {
1187 rDelete(r);
1188 r=rIncRefCnt(IDRING(h));
1189 break;
1190 }
1191 }
1192 if ((h==NULL) && ((currRing==NULL) || (!rEqual(r,currRing,1))))
1193 {
1194 char name[20];
1195 int nr=0;
1196 idhdl hh=NULL;
1197 loop
1198 {
1199 snprintf(name,20,"ssiRing%d",nr); nr++;
1200 hh=IDROOT->get(name, 0);
1201 if (hh==NULL)
1202 {
1204 break;
1205 }
1206 else if ((IDTYP(hh)==RING_CMD)
1207 && (rEqual(r,IDRING(hh),1)))
1208 {
1209 break;
1210 }
1211 }
1212 rSetHdl(hh);
1213 }
1214 else
1215 rSetHdl(h);
1216 return r;
1217}
idhdl enterid(const char *s, int lev, int t, idhdl *root, BOOLEAN init, BOOLEAN search)
Definition ipid.cc:256
#define IDROOT
Definition ipid.h:19
#define IDRING(a)
Definition ipid.h:127
#define IDTYP(a)
Definition ipid.h:119
void rSetHdl(idhdl h)
Definition ipshell.cc:5129
void rDelete(ring r)
unconditionally deletes fields in r
Definition ring.cc:454
BOOLEAN rEqual(ring r1, ring r2, BOOLEAN qr)
returns TRUE, if r1 equals r2 FALSE, otherwise Equality is determined componentwise,...
Definition ring.cc:1752
int name
New type name for int.

◆ ssiReservePort()

int ssiReservePort ( int clients)

Definition at line 3158 of file ssiLink.cc.

3159{
3160 if (ssiReserved_P!=0)
3161 {
3162 WerrorS("ERROR already a reserved port requested");
3163 return 0;
3164 }
3165 int portno;
3166 ssiReserved_sockfd = socket(AF_INET, SOCK_STREAM, 0);
3167 if(ssiReserved_sockfd < 0)
3168 {
3169 WerrorS("ERROR opening socket");
3170 return 0;
3171 }
3172 memset((char *) &ssiResverd_serv_addr,0, sizeof(ssiResverd_serv_addr));
3173 portno = 1025;
3174 ssiResverd_serv_addr.sin_family = AF_INET;
3175 ssiResverd_serv_addr.sin_addr.s_addr = INADDR_ANY;
3176 do
3177 {
3178 portno++;
3179 ssiResverd_serv_addr.sin_port = htons(portno);
3180 if(portno > 50000)
3181 {
3182 WerrorS("ERROR on binding (no free port available?)");
3183 return 0;
3184 }
3185 }
3186 while(bind(ssiReserved_sockfd, (struct sockaddr *) &ssiResverd_serv_addr, sizeof(ssiResverd_serv_addr)) < 0);
3187 ssiReserved_P=portno;
3188 listen(ssiReserved_sockfd,clients);
3189 ssiReserved_Clients=clients;
3190 return portno;
3191}

◆ ssiWrite()

BOOLEAN ssiWrite ( si_link l,
leftv v )

Definition at line 2537 of file ssiLink.cc.

2538{
2539 if(SI_LINK_W_OPEN_P(l)==0)
2541 if (strcmp(l->mode,"string")==0) return TRUE;
2542 ssiInfo *d = (ssiInfo *)l->data;
2543 d->level++;
2544 //FILE *fich=d->f;
2545 while (data!=NULL)
2546 {
2547 int tt=data->Typ();
2548 void *dd=data->Data();
2549 attr *aa=data->Attribute();
2550 if ((aa!=NULL) && ((*aa)!=NULL)) // n user attributes
2551 {
2552 attr a=*aa;
2553 int n=0;
2554 while(a!=NULL) { n++; a=a->next;}
2555 fprintf(d->f_write,"21 %d %d ",data->flag,n);
2556 }
2557 else if (data->flag!=0) // only "flag" attributes
2558 {
2559 fprintf(d->f_write,"21 %d 0 ",data->flag);
2560 }
2561 if ((dd==NULL) && (data->name!=NULL) && (tt==0)) tt=DEF_CMD;
2562 // return pure undefined names as def
2563
2564 switch(tt /*data->Typ()*/)
2565 {
2566 case 0: /*error*/
2567 case NONE/* nothing*/:fputs("16 ",d->f_write);
2568 break;
2569 case STRING_CMD: fputs("2 ",d->f_write);
2570 ssiWriteString(d,(char *)dd);
2571 break;
2572 case INT_CMD: fputs("1 ",d->f_write);
2573 ssiWriteInt(d,(int)(long)dd);
2574 break;
2575 case BIGINT_CMD:fputs("4 ",d->f_write);
2576 ssiWriteBigInt(d,(number)dd);
2577 break;
2578 case NUMBER_CMD:
2579 if (d->r!=currRing)
2580 {
2581 fputs("15 ",d->f_write);
2583 if (d->level<=1) fputc('\n',d->f_write);
2584 }
2585 fputs("3 ",d->f_write);
2586 ssiWriteNumber(d,(number)dd);
2587 break;
2588 case RING_CMD:fputs("5 ",d->f_write);
2589 ssiWriteRing(d,(ring)dd);
2590 break;
2591 case BUCKET_CMD:
2592 {
2594 if (d->r!=sBucketGetRing(b))
2595 {
2596 fputs("15 ",d->f_write);
2598 if (d->level<=1) fputc('\n',d->f_write);
2599 }
2600 fputs("6 ",d->f_write);
2602 break;
2603 }
2604 case POLY_CMD:
2605 case VECTOR_CMD:
2606 if (d->r!=currRing)
2607 {
2608 fputs("15 ",d->f_write);
2610 if (d->level<=1) fputc('\n',d->f_write);
2611 }
2612 if(tt==POLY_CMD) fputs("6 ",d->f_write);
2613 else fputs("9 ",d->f_write);
2614 ssiWritePoly(d,(poly)dd);
2615 break;
2616 case IDEAL_CMD:
2617 case MODUL_CMD:
2618 case MATRIX_CMD:
2619 case SMATRIX_CMD:
2620 if (d->r!=currRing)
2621 {
2622 fputs("15 ",d->f_write);
2624 if (d->level<=1) fputc('\n',d->f_write);
2625 }
2626 if(tt==IDEAL_CMD) fputs("7 ",d->f_write);
2627 else if(tt==MATRIX_CMD) fputs("8 ",d->f_write);
2628 else /* tt==MODUL_CMD, SMATRIX_CMD*/
2629 {
2630 ideal M=(ideal)dd;
2631 if (tt==MODUL_CMD)
2632 fprintf(d->f_write,"10 %d ",(int)M->rank);
2633 else /*(tt==SMATRIX_CMD)*/
2634 fprintf(d->f_write,"22 %d ",(int)M->rank);
2635 }
2636 ssiWriteIdeal(d,tt,(ideal)dd);
2637 break;
2638 case COMMAND:
2639 fputs("11 ",d->f_write);
2641 break;
2642 case DEF_CMD: /* not evaluated stuff in quotes */
2643 fputs("12 ",d->f_write);
2644 ssiWriteString(d,data->Name());
2645 break;
2646 case PROC_CMD:
2647 fputs("13 ",d->f_write);
2648 ssiWriteProc(d,(procinfov)dd);
2649 break;
2650 case LIST_CMD:
2651 fputs("14 ",d->f_write);
2652 ssiWriteList(l,(lists)dd);
2653 break;
2654 case INTVEC_CMD:
2655 fputs("17 ",d->f_write);
2656 ssiWriteIntvec(d,(intvec *)dd);
2657 break;
2658 case INTMAT_CMD:
2659 fputs("18 ",d->f_write);
2660 ssiWriteIntmat(d,(intvec *)dd);
2661 break;
2662 case BIGINTMAT_CMD:
2663 fputs("19 ",d->f_write);
2665 break;
2666 case BIGINTVEC_CMD:
2667 fputs("24 ",d->f_write);
2669 break;
2670 default:
2671 if (tt>MAX_TOK)
2672 {
2673 blackbox *b=getBlackboxStuff(tt);
2674 fputs("20 ",d->f_write);
2675 b->blackbox_serialize(b,dd,l);
2676 }
2677 else
2678 {
2679 Werror("not implemented (t:%d, rtyp:%d)",tt, data->rtyp);
2680 d->level=0;
2681 return TRUE;
2682 }
2683 break;
2684 }
2685 if (d->level<=1) { fputc('\n',d->f_write); fflush(d->f_write); }
2686 data=data->next;
2687 }
2688 d->level--;
2689 return FALSE;
2690}
sattr * attr
Definition attrib.h:16
blackbox * getBlackboxStuff(const int t)
return the structure to the type given by t
Definition blackbox.cc:17
CanonicalForm b
Definition cfModGcd.cc:4111
Matrices of numbers.
Definition bigintmat.h:51
attr next
Definition attrib.h:26
@ BUCKET_CMD
Definition grammar.cc:284
ip_command * command
Definition ipid.h:23
slists * lists
poly sBucketPeek(sBucket_pt b)
Definition sbuckets.cc:455
ring sBucketGetRing(const sBucket_pt bucket)
Returns bucket ring.
Definition sbuckets.cc:46
sBucket * sBucket_pt
Definition sbuckets.h:16
procinfo * procinfov
Definition structs.h:56

◆ ssiWrite2()

BOOLEAN ssiWrite2 ( si_link l,
leftv res,
leftv v )

Definition at line 3475 of file ssiLink.cc.

3476{
3477 if((strcmp(l->mode,"string")==0)
3478 &&(u->Typ()==STRING_CMD))
3479 {
3480 StringSetS("");
3481 ssiWrite_S(u, currRing);
3482 res->data=(void*)StringEndS();
3483 res->rtyp=STRING_CMD;
3484 return res->data==NULL;
3485 }
3486 return TRUE;
3487}
void StringSetS(const char *st)
Definition reporter.cc:128
char * StringEndS()
Definition reporter.cc:151

◆ ssiWrite_S()

void ssiWrite_S ( leftv v,
const ring R )

Definition at line 2691 of file ssiLink.cc.

2692{
2693 while(data!=NULL)
2694 {
2695 int tt=data->Typ();
2696 void *dd=data->Data();
2697 switch(tt /*data->Typ()*/)
2698 {
2699 case 0: /*error*/
2700 case NONE/* nothing*/:StringAppendS("16 ");
2701 break;
2702 case INT_CMD: StringAppendS("1 ");
2703 ssiWriteInt_S((int)(long)dd);
2704 break;
2705 case STRING_CMD: StringAppendS("2 ");
2706 ssiWriteString_S((char *)dd);
2707 break;
2708 case BIGINT_CMD:StringAppendS("4 ");
2709 ssiWriteBigInt_S((number)dd);
2710 break;
2711 case NUMBER_CMD:
2712 StringAppendS("3 ");
2713 ssiWriteNumber_CF_S((number)dd,R->cf);
2714 break;
2715 case RING_CMD:StringAppendS("5 ");
2716 ssiWriteRing_R_S((ring)dd);
2717 break;
2718 case BUCKET_CMD:
2719 {
2721 StringAppendS("6 ");
2723 break;
2724 }
2725 case POLY_CMD:
2726 case VECTOR_CMD:
2727 if(tt==POLY_CMD) StringAppendS("6 ");
2728 else StringAppendS("9 ");
2729 ssiWritePoly_R_S((poly)dd,R);
2730 break;
2731 case IDEAL_CMD:
2732 case MODUL_CMD:
2733 case MATRIX_CMD:
2734 case SMATRIX_CMD:
2735 if(tt==IDEAL_CMD) StringAppendS("7 ");
2736 else if(tt==MATRIX_CMD) StringAppendS("8 ");
2737 else /* tt==MODUL_CMD, SMATRIX_CMD*/
2738 {
2739 ideal M=(ideal)dd;
2740 if (tt==MODUL_CMD)
2741 {
2742 StringAppendS("10 ");StringAppend("%d ",(int)M->rank);
2743 }
2744 else /*(tt==SMATRIX_CMD)*/
2745 {
2746 StringAppendS("22 ");StringAppend("%d ",(int)M->rank);
2747 }
2748 }
2749 ssiWriteIdeal_R_S(tt,(ideal)dd,R);
2750 break;
2751 #if 0
2752 case COMMAND:
2753 fputs("11 ",d->f_write);
2755 break;
2756 #endif
2757 case DEF_CMD: /* not evaluated stuff in quotes */
2758 StringAppendS("12 ");
2759 ssiWriteString_S(data->Name());
2760 break;
2761 case PROC_CMD:
2762 StringAppendS("13 ");
2764 break;
2765 case LIST_CMD:
2766 StringAppendS("14 ");
2767 ssiWriteList_S((lists)dd,R);
2768 break;
2769 case INTVEC_CMD:
2770 StringAppendS("17 ");
2771 ssiWriteIntvec_S((intvec *)dd);
2772 break;
2773 case INTMAT_CMD:
2774 StringAppendS("18 ");
2775 ssiWriteIntmat_S((intvec *)dd);
2776 break;
2777 case BIGINTMAT_CMD:
2778 StringAppendS("19 ");
2780 break;
2781 case BIGINTVEC_CMD:
2782 StringAppendS("24 ");
2784 break;
2785 default:
2786 #if 0
2787 if (tt>MAX_TOK)
2788 {
2789 blackbox *b=getBlackboxStuff(tt);
2790 fputs("20 ",d->f_write);
2791 b->blackbox_serialize(b,dd,l);
2792 }
2793 else
2794 #endif
2795 {
2796 Werror("not implemented (t:%d, rtyp:%d)",tt, data->rtyp);
2797 return;
2798 }
2799 break;
2800 }
2801 data=data->next;
2802 }
2803}
#define StringAppend
Definition emacs.cc:79
void StringAppendS(const char *st)
Definition reporter.cc:107

◆ ssiWriteIdeal()

void ssiWriteIdeal ( const ssiInfo * d,
int typ,
const ideal I )

Definition at line 612 of file ssiLink.cc.

613{
614 ssiWriteIdeal_R(d,typ,I,d->r);
615}

◆ ssiWriteIdeal_S()

char * ssiWriteIdeal_S ( const ideal I,
const ring R )

Definition at line 616 of file ssiLink.cc.

617{
618 StringSetS("");
620 return StringEndS();
621}

◆ ssiWriteInt()

void ssiWriteInt ( const ssiInfo * d,
const int i )

Definition at line 156 of file ssiLink.cc.

157{
158 fprintf(d->f_write,"%d ",i);
159}

◆ ssiWriteMatrix_S()

char * ssiWriteMatrix_S ( const matrix M,
const ring R )

Definition at line 622 of file ssiLink.cc.

623{
624 StringSetS("");
626 return StringEndS();
627}

◆ ssiWriteModule_S()

char * ssiWriteModule_S ( const ideal M,
const ring R )

Definition at line 628 of file ssiLink.cc.

629{
630 StringSetS("");
632 return StringEndS();
633}

◆ ssiWritePoly_S()

char * ssiWritePoly_S ( poly p,
const ring r )

Definition at line 560 of file ssiLink.cc.

561{
562 StringSetS("");
564 return StringEndS();
565}
int p
Definition cfModGcd.cc:4086

◆ ssiWriteRing_S()

char * ssiWriteRing_S ( const ring r)

Definition at line 514 of file ssiLink.cc.

515{
516 StringSetS("");
518 return StringEndS();
519}