1000{
1002 {
1003 const char *mode;
1006 {
1007 if (
l->mode[0] !=
'\0' && (strcmp(
l->mode,
"r") == 0))
1010 }
1011
1013 else if (strcmp(
l->mode,
"w") == 0) mode =
"w";
1014 else if (strcmp(
l->mode,
"fork") == 0) mode =
"fork";
1015 else if (strcmp(
l->mode,
"tcp") == 0) mode =
"tcp";
1016 else if (strcmp(
l->mode,
"connect") == 0) mode =
"connect";
1017 else mode = "a";
1018
1019
1025
1026 if (
l->name[0] ==
'\0')
1027 {
1028 if (strcmp(mode,"fork")==0)
1029 {
1030 int pc[2];
1031 int cp[2];
1032 int err1=pipe(pc);
1033 int err2=pipe(cp);
1034 if (err1 || err2)
1035 {
1036 Werror(
"pipe failed with %d\n",errno);
1038 }
1044
1045 pid_t pid = fork();
1046 if (pid == -1 && errno == EAGAIN)
1047 {
1049 pid = fork();
1050 }
1051 if (pid == -1)
1052 {
1054 }
1055 if (pid==0)
1056 {
1057
1058 sigset_t sigint;
1059 sigemptyset(&sigint);
1060 sigaddset(&sigint, SIGINT);
1061 sigprocmask(SIG_BLOCK, &sigint,
NULL);
1063
1065
1067
1069 {
1073 fclose(dd->f_write);
1079 hh=nn;
1080 }
1082#ifdef HAVE_SIMPLEIPC
1084#endif
1085 si_close(pc[1]); si_close(cp[0]);
1090
1091
1097
1100 {
1103 }
1105 {
1110 {
1111
1114 }
1118 }
1119
1120 }
1121 else if (pid>0)
1122 {
1124 si_close(pc[0]); si_close(cp[1]);
1131
1132
1133 }
1134 else
1135 {
1136 Werror(
"fork failed (%d)",errno);
1140 }
1141 }
1142
1143 else if (strcmp(mode,"tcp")==0)
1144 {
1145 int sockfd, newsockfd, portno, clilen;
1146 struct sockaddr_in serv_addr, cli_addr;
1147 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1148 if(sockfd < 0)
1149 {
1150 WerrorS(
"ERROR opening socket");
1155 }
1156 memset((char *) &serv_addr,0, sizeof(serv_addr));
1157 portno = 1025;
1158 serv_addr.sin_family = AF_INET;
1159 serv_addr.sin_addr.s_addr = INADDR_ANY;
1160 do
1161 {
1162 portno++;
1163 serv_addr.sin_port = htons(portno);
1164 if(portno > 50000)
1165 {
1166 WerrorS(
"ERROR on binding (no free port available?)");
1171 }
1172 }
1173 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1175 listen(sockfd,1);
1176 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1177 if(newsockfd < 0)
1178 {
1184 }
1185 PrintS(
"client accepted\n");
1189 d->
f_write = fdopen(newsockfd,
"w");
1191 si_close(sockfd);
1192 }
1193
1194 else
1195 {
1196 Werror(
"invalid mode >>%s<< for ssi",mode);
1201 }
1202 }
1203
1204 else
1205 {
1206
1207 if(strcmp(mode,"tcp")==0)
1208 {
1209 int sockfd, newsockfd, portno, clilen;
1210 struct sockaddr_in serv_addr, cli_addr;
1211 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1212 if(sockfd < 0)
1213 {
1214 WerrorS(
"ERROR opening socket");
1219 }
1220 memset((char *) &serv_addr,0, sizeof(serv_addr));
1221 portno = 1025;
1222 serv_addr.sin_family = AF_INET;
1223 serv_addr.sin_addr.s_addr = INADDR_ANY;
1224 do
1225 {
1226 portno++;
1227 serv_addr.sin_port = htons(portno);
1228 if(portno > 50000)
1229 {
1230 WerrorS(
"ERROR on binding (no free port available?)");
1234 }
1235 }
1236 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1237
1238 listen(sockfd,1);
1239 char* cli_host = (
char*)
omAlloc(256);
1240 char* path = (
char*)
omAlloc(1024);
1241 int r = si_sscanf(
l->name,
"%255[^:]:%s",cli_host,path);
1242 if(r == 0)
1243 {
1244 WerrorS(
"ERROR: no host specified");
1251 }
1252 else if(r == 1)
1253 {
1254 WarnS(
"program not specified, using /usr/local/bin/Singular");
1256 strcpy(path,"/usr/local/bin/Singular");
1257 }
1258 char* ssh_command = (
char*)
omAlloc(256);
1259 char* ser_host = (
char*)
omAlloc(64);
1260 if(strcmp(cli_host,"localhost")==0)
1261 strcpy(ser_host,"localhost");
1262 else
1263 gethostname(ser_host,64);
1264 if (strcmp(cli_host,"localhost")==0)
1265 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1266 else
1267 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1268
1272 int re=system(ssh_command);
1273 if (re<0)
1274 {
1275 Werror(
"ERROR running `%s` (%d)",ssh_command,re);
1280 }
1283 clilen = sizeof(cli_addr);
1284 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1285 if(newsockfd < 0)
1286 {
1292 }
1293
1297 d->
f_write = fdopen(newsockfd,
"w");
1298 si_close(sockfd);
1307 }
1308
1309 else if(strcmp(mode,"connect")==0)
1310 {
1311 char* host = (
char*)
omAlloc(256);
1312 int sockfd, portno;
1313 struct sockaddr_in serv_addr;
1314 struct hostent *server;
1315
1316 si_sscanf(
l->name,
"%255[^:]:%d",host,&portno);
1317
1318 if (portno!=0)
1319 {
1320 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1321 if (sockfd < 0)
1322 {
1323 WerrorS(
"ERROR opening socket");
1326 }
1327 server = gethostbyname(host);
1329 {
1330 WerrorS(
"ERROR, no such host");
1333 }
1334 memset((char *) &serv_addr, 0, sizeof(serv_addr));
1335 serv_addr.sin_family = AF_INET;
1336 memcpy((char *)&serv_addr.sin_addr.s_addr,
1337 (char *)server->h_addr,
1338 server->h_length);
1339 serv_addr.sin_port = htons(portno);
1340 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
1341 {
1342 Werror(
"ERROR connecting(errno=%d)",errno);
1345 }
1346
1349 d->
f_write=fdopen(sockfd,
"w");
1353 }
1354 else
1355 {
1360 }
1361 }
1362
1363 else
1364 {
1365
1367 FILE *outfile;
1368 char *filename=
l->name;
1369
1370 if(filename[0]=='>')
1371 {
1372 if (filename[1]=='>')
1373 {
1374 filename+=2;
1375 mode = "a";
1376 }
1377 else
1378 {
1379 filename++;
1380 mode="w";
1381 }
1382 }
1383 outfile=
myfopen(filename,mode);
1385 {
1386 if (strcmp(
l->mode,
"r")==0)
1387 {
1388 fclose(outfile);
1390 }
1391 else
1392 {
1395 }
1396 }
1397 else
1398 {
1403 }
1404 }
1405 }
1406 }
1407
1409}
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)
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