1648{
1650 {
1651 const char *mode;
1653 {
1654 if (strcmp(
l->mode,
"r") == 0)
1656 else if (strcmp(
l->mode,
"string")==0)
1657 {
1660 }
1662 }
1665 && (strcmp(
l->mode,
"string")==0))
1666 {
1669 }
1670
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
1683
1686 if (
l->name[0] ==
'\0')
1687 {
1688 if (strcmp(mode,"fork")==0)
1689 {
1691 if (cpus<1)
1692 {
1693 WerrorS(
"no sub-processes allowed");
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);
1710 }
1716
1717 pid_t pid = fork();
1718 if (pid == -1 && errno == EAGAIN)
1719 {
1721 pid = fork();
1722 }
1723 if (pid == -1)
1724 {
1730 }
1731 if (pid==0)
1732 {
1733
1734 sigset_t sigint;
1735 sigemptyset(&sigint);
1736 sigaddset(&sigint, SIGINT);
1737 sigprocmask(SIG_BLOCK, &sigint,
NULL);
1739
1741
1743
1745 {
1749 fclose(dd->f_write);
1755 hh=nn;
1756 }
1758#ifdef HAVE_SIMPLEIPC
1760#endif
1761 si_close(pc[1]); si_close(cp[0]);
1766
1767
1773
1776 {
1779 }
1781 {
1786 {
1787
1790 }
1794 }
1795
1796 }
1797 else if (pid>0)
1798 {
1800 si_close(pc[0]); si_close(cp[1]);
1807
1808
1809 }
1810 else
1811 {
1812 Werror(
"fork failed (%d)",errno);
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");
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?)");
1847 }
1848 }
1849 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1851 listen(sockfd,1);
1852 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1853 if(newsockfd < 0)
1854 {
1860 }
1861 PrintS(
"client accepted\n");
1865 d->
f_write = fdopen(newsockfd,
"w");
1867 si_close(sockfd);
1868 }
1869
1870 else if (strcmp(mode,"string")==0)
1871 {
1873 }
1874 else
1875 {
1876 Werror(
"invalid mode >>%s<< for ssi",mode);
1881 }
1882 }
1883
1884 else
1885 {
1886
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");
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?)");
1915 }
1916 }
1917 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1918
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");
1932 }
1933 else if(r == 1)
1934 {
1935 WarnS(
"program not specified, using /usr/local/bin/Singular");
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)
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
1953 int re=system(ssh_command);
1954 if (re<0)
1955 {
1956 Werror(
"ERROR running `%s` (%d)",ssh_command,re);
1961 }
1964 clilen = sizeof(cli_addr);
1965 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1966 if(newsockfd < 0)
1967 {
1973 }
1974
1978 d->
f_write = fdopen(newsockfd,
"w");
1979 si_close(sockfd);
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
1999 if (portno!=0)
2000 {
2001 sockfd = socket(AF_INET, SOCK_STREAM, 0);
2002 if (sockfd < 0)
2003 {
2004 WerrorS(
"ERROR opening socket");
2009 }
2010 server = gethostbyname(host);
2012 {
2013 WerrorS(
"ERROR, no such host");
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);
2032 }
2033
2036 d->
f_write=fdopen(sockfd,
"w");
2040 }
2041 else
2042 {
2047 }
2048 }
2049
2050 else
2051 {
2052
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);
2072 {
2073 if (strcmp(
l->mode,
"r")==0)
2074 {
2075 fclose(outfile);
2077 }
2078 else
2079 {
2082 }
2083 }
2084 else
2085 {
2090 }
2091 }
2092 }
2093 }
2094
2096}
VAR BOOLEAN singular_in_batchmode
si_hdl_typ si_set_signal(int sig, si_hdl_typ signal_handler)
meta function for binding a signal to an handler
FILE * myfopen(const char *path, const char *mode)
const char * feSetOptValue(feOptIndex opt, char *optarg)
static void * feOptValue(feOptIndex opt)
VAR char my_yylinebuf[80]
char * fe_fgets_dummy(const char *, char *, int)
char *(* fe_fgets_stdin)(const char *pr, char *s, int size)
EXTERN_VAR omBin sleftv_bin
#define omFreeBin(addr, bin)
#define omFreeBinAddr(addr)
void PrintS(const char *s)
s_buff s_open_by_name(const char *n)
VAR int sem_acquired[SIPC_MAX_SEMAPHORES]
#define SI_LINK_SET_OPEN_P(l, flag)
#define SIPC_MAX_SEMAPHORES