997{
999 {
1000 const char *mode;
1003 {
1004 if (
l->mode[0] !=
'\0' && (strcmp(
l->mode,
"r") == 0))
1007 }
1008
1010 else if (strcmp(
l->mode,
"w") == 0) mode =
"w";
1011 else if (strcmp(
l->mode,
"fork") == 0) mode =
"fork";
1012 else if (strcmp(
l->mode,
"tcp") == 0) mode =
"tcp";
1013 else if (strcmp(
l->mode,
"connect") == 0) mode =
"connect";
1014 else mode = "a";
1015
1016
1022
1023 if (
l->name[0] ==
'\0')
1024 {
1025 if (strcmp(mode,"fork")==0)
1026 {
1027 int pc[2];
1028 int cp[2];
1029 int err1=pipe(pc);
1030 int err2=pipe(cp);
1031 if (err1 || err2)
1032 {
1033 Werror(
"pipe failed with %d\n",errno);
1035 }
1041
1042 pid_t pid = fork();
1043 if (pid == -1 && errno == EAGAIN)
1044 {
1046 pid = fork();
1047 }
1048 if (pid == -1)
1049 {
1051 }
1052 if (pid==0)
1053 {
1054
1055 sigset_t sigint;
1056 sigemptyset(&sigint);
1057 sigaddset(&sigint, SIGINT);
1058 sigprocmask(SIG_BLOCK, &sigint,
NULL);
1059
1061
1063
1065 {
1069 fclose(dd->f_write);
1075 hh=nn;
1076 }
1078#ifdef HAVE_SIMPLEIPC
1080#endif
1081 si_close(pc[1]); si_close(cp[0]);
1086
1087
1093
1096 {
1099 }
1101 {
1106 {
1107
1110 }
1114 }
1115
1116 }
1117 else if (pid>0)
1118 {
1120 si_close(pc[0]); si_close(cp[1]);
1127
1128
1129 }
1130 else
1131 {
1132 Werror(
"fork failed (%d)",errno);
1136 }
1137 }
1138
1139 else if (strcmp(mode,"tcp")==0)
1140 {
1141 int sockfd, newsockfd, portno, clilen;
1142 struct sockaddr_in serv_addr, cli_addr;
1143 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1144 if(sockfd < 0)
1145 {
1146 WerrorS(
"ERROR opening socket");
1151 }
1152 memset((char *) &serv_addr,0, sizeof(serv_addr));
1153 portno = 1025;
1154 serv_addr.sin_family = AF_INET;
1155 serv_addr.sin_addr.s_addr = INADDR_ANY;
1156 do
1157 {
1158 portno++;
1159 serv_addr.sin_port = htons(portno);
1160 if(portno > 50000)
1161 {
1162 WerrorS(
"ERROR on binding (no free port available?)");
1167 }
1168 }
1169 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1171 listen(sockfd,1);
1172 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1173 if(newsockfd < 0)
1174 {
1180 }
1181 PrintS(
"client accepted\n");
1185 d->
f_write = fdopen(newsockfd,
"w");
1187 si_close(sockfd);
1188 }
1189
1190 else
1191 {
1192 Werror(
"invalid mode >>%s<< for ssi",mode);
1197 }
1198 }
1199
1200 else
1201 {
1202
1203 if(strcmp(mode,"tcp")==0)
1204 {
1205 int sockfd, newsockfd, portno, clilen;
1206 struct sockaddr_in serv_addr, cli_addr;
1207 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1208 if(sockfd < 0)
1209 {
1210 WerrorS(
"ERROR opening socket");
1215 }
1216 memset((char *) &serv_addr,0, sizeof(serv_addr));
1217 portno = 1025;
1218 serv_addr.sin_family = AF_INET;
1219 serv_addr.sin_addr.s_addr = INADDR_ANY;
1220 do
1221 {
1222 portno++;
1223 serv_addr.sin_port = htons(portno);
1224 if(portno > 50000)
1225 {
1226 WerrorS(
"ERROR on binding (no free port available?)");
1230 }
1231 }
1232 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1233
1234 listen(sockfd,1);
1235 char* cli_host = (
char*)
omAlloc(256);
1236 char* path = (
char*)
omAlloc(1024);
1237 int r = si_sscanf(
l->name,
"%255[^:]:%s",cli_host,path);
1238 if(r == 0)
1239 {
1240 WerrorS(
"ERROR: no host specified");
1247 }
1248 else if(r == 1)
1249 {
1250 WarnS(
"program not specified, using /usr/local/bin/Singular");
1252 strcpy(path,"/usr/local/bin/Singular");
1253 }
1254 char* ssh_command = (
char*)
omAlloc(256);
1255 char* ser_host = (
char*)
omAlloc(64);
1256 if(strcmp(cli_host,"localhost")==0)
1257 strcpy(ser_host,"localhost");
1258 else
1259 gethostname(ser_host,64);
1260 if (strcmp(cli_host,"localhost")==0)
1261 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1262 else
1263 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1264
1268 int re=system(ssh_command);
1269 if (re<0)
1270 {
1271 Werror(
"ERROR running `%s` (%d)",ssh_command,re);
1276 }
1279 clilen = sizeof(cli_addr);
1280 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1281 if(newsockfd < 0)
1282 {
1288 }
1289
1293 d->
f_write = fdopen(newsockfd,
"w");
1294 si_close(sockfd);
1303 }
1304
1305 else if(strcmp(mode,"connect")==0)
1306 {
1307 char* host = (
char*)
omAlloc(256);
1308 int sockfd, portno;
1309 struct sockaddr_in serv_addr;
1310 struct hostent *server;
1311
1312 si_sscanf(
l->name,
"%255[^:]:%d",host,&portno);
1313
1314 if (portno!=0)
1315 {
1316 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1317 if (sockfd < 0)
1318 {
1319 WerrorS(
"ERROR opening socket");
1322 }
1323 server = gethostbyname(host);
1325 {
1326 WerrorS(
"ERROR, no such host");
1329 }
1330 memset((char *) &serv_addr, 0, sizeof(serv_addr));
1331 serv_addr.sin_family = AF_INET;
1332 memcpy((char *)&serv_addr.sin_addr.s_addr,
1333 (char *)server->h_addr,
1334 server->h_length);
1335 serv_addr.sin_port = htons(portno);
1336 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
1337 {
1338 Werror(
"ERROR connecting(errno=%d)",errno);
1341 }
1342
1345 d->
f_write=fdopen(sockfd,
"w");
1349 }
1350 else
1351 {
1356 }
1357 }
1358
1359 else
1360 {
1361
1362 FILE *outfile;
1363 char *filename=
l->name;
1364
1365 if(filename[0]=='>')
1366 {
1367 if (filename[1]=='>')
1368 {
1369 filename+=2;
1370 mode = "a";
1371 }
1372 else
1373 {
1374 filename++;
1375 mode="w";
1376 }
1377 }
1378 outfile=
myfopen(filename,mode);
1380 {
1381 if (strcmp(
l->mode,
"r")==0)
1382 {
1383 fclose(outfile);
1385 }
1386 else
1387 {
1390 }
1391 }
1392 else
1393 {
1398 }
1399 }
1400 }
1401 }
1402
1404}
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_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 SI_LINK_OPEN_P(l)
#define SIPC_MAX_SEMAPHORES