924 if (
l->mode[0] !=
'\0' && (strcmp(
l->mode,
"r") == 0))
930 else if (strcmp(
l->mode,
"w") == 0) mode =
"w";
931 else if (strcmp(
l->mode,
"fork") == 0) mode =
"fork";
932 else if (strcmp(
l->mode,
"tcp") == 0) mode =
"tcp";
933 else if (strcmp(
l->mode,
"connect") == 0) mode =
"connect";
943 if (
l->name[0] ==
'\0')
945 if (strcmp(mode,
"fork")==0)
958 if (pid == -1 && errno == EAGAIN)
971 sigemptyset(&sigint);
972 sigaddset(&sigint, SIGINT);
973 sigprocmask(SIG_BLOCK, &sigint,
NULL);
993 #ifdef HAVE_SIMPLEIPC
996 si_close(pc[1]); si_close(cp[0]);
1035 si_close(pc[0]); si_close(cp[1]);
1047 Werror(
"fork failed (%d)",errno);
1054 else if (strcmp(mode,
"tcp")==0)
1056 int sockfd, newsockfd, portno, clilen;
1057 struct sockaddr_in serv_addr, cli_addr;
1058 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1061 WerrorS(
"ERROR opening socket");
1067 memset((
char *) &serv_addr,0,
sizeof(serv_addr));
1069 serv_addr.sin_family = AF_INET;
1070 serv_addr.sin_addr.s_addr = INADDR_ANY;
1074 serv_addr.sin_port = htons(portno);
1077 WerrorS(
"ERROR on binding (no free port available?)");
1084 while(bind(sockfd, (
struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0);
1087 newsockfd = si_accept(sockfd, (
struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1096 PrintS(
"client accepted\n");
1100 d->
f_write = fdopen(newsockfd,
"w");
1107 Werror(
"invalid mode >>%s<< for ssi",mode);
1118 if(strcmp(mode,
"tcp")==0)
1120 int sockfd, newsockfd, portno, clilen;
1121 struct sockaddr_in serv_addr, cli_addr;
1122 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1125 WerrorS(
"ERROR opening socket");
1131 memset((
char *) &serv_addr,0,
sizeof(serv_addr));
1133 serv_addr.sin_family = AF_INET;
1134 serv_addr.sin_addr.s_addr = INADDR_ANY;
1138 serv_addr.sin_port = htons(portno);
1141 WerrorS(
"ERROR on binding (no free port available?)");
1147 while(bind(sockfd, (
struct sockaddr *) &serv_addr,
sizeof(serv_addr)) < 0);
1150 char* cli_host = (
char*)
omAlloc(256);
1151 char* path = (
char*)
omAlloc(1024);
1152 int r = si_sscanf(
l->name,
"%255[^:]:%s",cli_host,path);
1155 WerrorS(
"ERROR: no host specified");
1165 WarnS(
"program not specified, using /usr/local/bin/Singular");
1167 strcpy(path,
"/usr/local/bin/Singular");
1169 char* ssh_command = (
char*)
omAlloc(256);
1170 char* ser_host = (
char*)
omAlloc(64);
1171 gethostname(ser_host,64);
1172 if (strcmp(cli_host,
"localhost")==0)
1173 sprintf(ssh_command,
"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1175 sprintf(ssh_command,
"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1180 system(ssh_command);
1183 clilen =
sizeof(cli_addr);
1184 newsockfd = si_accept(sockfd, (
struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1197 d->
f_write = fdopen(newsockfd,
"w");
1209 else if(strcmp(mode,
"connect")==0)
1211 char* host = (
char*)
omAlloc(256);
1213 struct sockaddr_in serv_addr;
1214 struct hostent *server;
1216 si_sscanf(
l->name,
"%255[^:]:%d",host,&portno);
1220 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1223 WerrorS(
"ERROR opening socket");
1227 server = gethostbyname(host);
1230 WerrorS(
"ERROR, no such host");
1234 memset((
char *) &serv_addr, 0,
sizeof(serv_addr));
1235 serv_addr.sin_family = AF_INET;
1236 memcpy((
char *)&serv_addr.sin_addr.s_addr,
1237 (
char *)server->h_addr,
1239 serv_addr.sin_port = htons(portno);
1240 if (si_connect(sockfd,(sockaddr*)&serv_addr,
sizeof(serv_addr)) < 0)
1242 Werror(
"ERROR connecting(errno=%d)",errno);
1249 d->
f_write=fdopen(sockfd,
"w");
1267 char *filename=
l->name;
1269 if(filename[0]==
'>')
1271 if (filename[1]==
'>')
1282 outfile=
myfopen(filename,mode);
1285 if (strcmp(
l->mode,
"r")==0)
Class used for (list of) interpreter objects.
VAR BOOLEAN singular_in_batchmode
FILE * myfopen(const char *path, const char *mode)
const char * feSetOptValue(feOptIndex opt, char *optarg)
VAR char my_yylinebuf[80]
char *(* fe_fgets_stdin)(const char *pr, char *s, int size)
char * fe_fgets_dummy(const char *, char *, int)
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 SI_LINK_OPEN_P(l)
#define SI_LINK_CLOSE_P(l)
#define SIPC_MAX_SEMAPHORES