999{
1001 {
1002 const char *mode;
1005 {
1006 if (
l->mode[0] !=
'\0' && (strcmp(
l->mode,
"r") == 0))
1009 }
1010
1012 else if (strcmp(
l->mode,
"w") == 0) mode =
"w";
1013 else if (strcmp(
l->mode,
"fork") == 0) mode =
"fork";
1014 else if (strcmp(
l->mode,
"tcp") == 0) mode =
"tcp";
1015 else if (strcmp(
l->mode,
"connect") == 0) mode =
"connect";
1016 else mode = "a";
1017
1018
1024
1025 if (
l->name[0] ==
'\0')
1026 {
1027 if (strcmp(mode,"fork")==0)
1028 {
1029 int pc[2];
1030 int cp[2];
1031 int err1=pipe(pc);
1032 int err2=pipe(cp);
1033 if (err1 || err2)
1034 {
1035 Werror(
"pipe failed with %d\n",errno);
1037 }
1043
1044 pid_t pid = fork();
1045 if (pid == -1 && errno == EAGAIN)
1046 {
1048 pid = fork();
1049 }
1050 if (pid == -1)
1051 {
1053 }
1054 if (pid==0)
1055 {
1056
1057 sigset_t sigint;
1058 sigemptyset(&sigint);
1059 sigaddset(&sigint, SIGINT);
1060 sigprocmask(SIG_BLOCK, &sigint,
NULL);
1061
1063
1065
1067 {
1071 fclose(dd->f_write);
1077 hh=nn;
1078 }
1080#ifdef HAVE_SIMPLEIPC
1082#endif
1083 si_close(pc[1]); si_close(cp[0]);
1088
1089
1095
1098 {
1101 }
1103 {
1108 {
1109
1112 }
1116 }
1117
1118 }
1119 else if (pid>0)
1120 {
1122 si_close(pc[0]); si_close(cp[1]);
1129
1130
1131 }
1132 else
1133 {
1134 Werror(
"fork failed (%d)",errno);
1138 }
1139 }
1140
1141 else if (strcmp(mode,"tcp")==0)
1142 {
1143 int sockfd, newsockfd, portno, clilen;
1144 struct sockaddr_in serv_addr, cli_addr;
1145 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1146 if(sockfd < 0)
1147 {
1148 WerrorS(
"ERROR opening socket");
1153 }
1154 memset((char *) &serv_addr,0, sizeof(serv_addr));
1155 portno = 1025;
1156 serv_addr.sin_family = AF_INET;
1157 serv_addr.sin_addr.s_addr = INADDR_ANY;
1158 do
1159 {
1160 portno++;
1161 serv_addr.sin_port = htons(portno);
1162 if(portno > 50000)
1163 {
1164 WerrorS(
"ERROR on binding (no free port available?)");
1169 }
1170 }
1171 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1173 listen(sockfd,1);
1174 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1175 if(newsockfd < 0)
1176 {
1182 }
1183 PrintS(
"client accepted\n");
1187 d->
f_write = fdopen(newsockfd,
"w");
1189 si_close(sockfd);
1190 }
1191
1192 else
1193 {
1194 Werror(
"invalid mode >>%s<< for ssi",mode);
1199 }
1200 }
1201
1202 else
1203 {
1204
1205 if(strcmp(mode,"tcp")==0)
1206 {
1207 int sockfd, newsockfd, portno, clilen;
1208 struct sockaddr_in serv_addr, cli_addr;
1209 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1210 if(sockfd < 0)
1211 {
1212 WerrorS(
"ERROR opening socket");
1217 }
1218 memset((char *) &serv_addr,0, sizeof(serv_addr));
1219 portno = 1025;
1220 serv_addr.sin_family = AF_INET;
1221 serv_addr.sin_addr.s_addr = INADDR_ANY;
1222 do
1223 {
1224 portno++;
1225 serv_addr.sin_port = htons(portno);
1226 if(portno > 50000)
1227 {
1228 WerrorS(
"ERROR on binding (no free port available?)");
1232 }
1233 }
1234 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1235
1236 listen(sockfd,1);
1237 char* cli_host = (
char*)
omAlloc(256);
1238 char* path = (
char*)
omAlloc(1024);
1239 int r = si_sscanf(
l->name,
"%255[^:]:%s",cli_host,path);
1240 if(r == 0)
1241 {
1242 WerrorS(
"ERROR: no host specified");
1249 }
1250 else if(r == 1)
1251 {
1252 WarnS(
"program not specified, using /usr/local/bin/Singular");
1254 strcpy(path,"/usr/local/bin/Singular");
1255 }
1256 char* ssh_command = (
char*)
omAlloc(256);
1257 char* ser_host = (
char*)
omAlloc(64);
1258 if(strcmp(cli_host,"localhost")==0)
1259 strcpy(ser_host,"localhost");
1260 else
1261 gethostname(ser_host,64);
1262 if (strcmp(cli_host,"localhost")==0)
1263 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1264 else
1265 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1266
1270 int re=system(ssh_command);
1271 if (re<0)
1272 {
1273 Werror(
"ERROR running `%s` (%d)",ssh_command,re);
1278 }
1281 clilen = sizeof(cli_addr);
1282 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1283 if(newsockfd < 0)
1284 {
1290 }
1291
1295 d->
f_write = fdopen(newsockfd,
"w");
1296 si_close(sockfd);
1305 }
1306
1307 else if(strcmp(mode,"connect")==0)
1308 {
1309 char* host = (
char*)
omAlloc(256);
1310 int sockfd, portno;
1311 struct sockaddr_in serv_addr;
1312 struct hostent *server;
1313
1314 si_sscanf(
l->name,
"%255[^:]:%d",host,&portno);
1315
1316 if (portno!=0)
1317 {
1318 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1319 if (sockfd < 0)
1320 {
1321 WerrorS(
"ERROR opening socket");
1324 }
1325 server = gethostbyname(host);
1327 {
1328 WerrorS(
"ERROR, no such host");
1331 }
1332 memset((char *) &serv_addr, 0, sizeof(serv_addr));
1333 serv_addr.sin_family = AF_INET;
1334 memcpy((char *)&serv_addr.sin_addr.s_addr,
1335 (char *)server->h_addr,
1336 server->h_length);
1337 serv_addr.sin_port = htons(portno);
1338 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
1339 {
1340 Werror(
"ERROR connecting(errno=%d)",errno);
1343 }
1344
1347 d->
f_write=fdopen(sockfd,
"w");
1351 }
1352 else
1353 {
1358 }
1359 }
1360
1361 else
1362 {
1363
1365 FILE *outfile;
1366 char *filename=
l->name;
1367
1368 if(filename[0]=='>')
1369 {
1370 if (filename[1]=='>')
1371 {
1372 filename+=2;
1373 mode = "a";
1374 }
1375 else
1376 {
1377 filename++;
1378 mode="w";
1379 }
1380 }
1381 outfile=
myfopen(filename,mode);
1383 {
1384 if (strcmp(
l->mode,
"r")==0)
1385 {
1386 fclose(outfile);
1388 }
1389 else
1390 {
1393 }
1394 }
1395 else
1396 {
1401 }
1402 }
1403 }
1404 }
1405
1407}
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