974{
976 {
977 const char *mode;
980 {
981 if (
l->mode[0] !=
'\0' && (strcmp(
l->mode,
"r") == 0))
984 }
985
987 else if (strcmp(
l->mode,
"w") == 0) mode =
"w";
988 else if (strcmp(
l->mode,
"fork") == 0) mode =
"fork";
989 else if (strcmp(
l->mode,
"tcp") == 0) mode =
"tcp";
990 else if (strcmp(
l->mode,
"connect") == 0) mode =
"connect";
991 else mode = "a";
992
993
999
1000 if (
l->name[0] ==
'\0')
1001 {
1002 if (strcmp(mode,"fork")==0)
1003 {
1009
1010 int pc[2];
1011 int cp[2];
1012 pipe(pc);
1013 pipe(cp);
1014 pid_t pid = fork();
1015 if (pid == -1 && errno == EAGAIN)
1016 {
1018 pid = fork();
1019 }
1020 if (pid == -1)
1021 {
1023 }
1024 if (pid==0)
1025 {
1026
1027 sigset_t sigint;
1028 sigemptyset(&sigint);
1029 sigaddset(&sigint, SIGINT);
1030 sigprocmask(SIG_BLOCK, &sigint,
NULL);
1031
1033
1035
1037 {
1047 hh=nn;
1048 }
1050#ifdef HAVE_SIMPLEIPC
1052#endif
1053 si_close(pc[1]); si_close(cp[0]);
1058
1059
1065
1068 {
1071 }
1073 {
1078 {
1079
1082 }
1086 }
1087
1088 }
1089 else if (pid>0)
1090 {
1092 si_close(pc[0]); si_close(cp[1]);
1099
1100
1101 }
1102 else
1103 {
1104 Werror(
"fork failed (%d)",errno);
1108 }
1109 }
1110
1111 else if (strcmp(mode,"tcp")==0)
1112 {
1113 int sockfd, newsockfd, portno, clilen;
1114 struct sockaddr_in serv_addr, cli_addr;
1115 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1116 if(sockfd < 0)
1117 {
1118 WerrorS(
"ERROR opening socket");
1123 }
1124 memset((char *) &serv_addr,0, sizeof(serv_addr));
1125 portno = 1025;
1126 serv_addr.sin_family = AF_INET;
1127 serv_addr.sin_addr.s_addr = INADDR_ANY;
1128 do
1129 {
1130 portno++;
1131 serv_addr.sin_port = htons(portno);
1132 if(portno > 50000)
1133 {
1134 WerrorS(
"ERROR on binding (no free port available?)");
1139 }
1140 }
1141 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1143 listen(sockfd,1);
1144 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1145 if(newsockfd < 0)
1146 {
1152 }
1153 PrintS(
"client accepted\n");
1157 d->
f_write = fdopen(newsockfd,
"w");
1159 si_close(sockfd);
1160 }
1161
1162 else
1163 {
1164 Werror(
"invalid mode >>%s<< for ssi",mode);
1169 }
1170 }
1171
1172 else
1173 {
1174
1175 if(strcmp(mode,"tcp")==0)
1176 {
1177 int sockfd, newsockfd, portno, clilen;
1178 struct sockaddr_in serv_addr, cli_addr;
1179 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1180 if(sockfd < 0)
1181 {
1182 WerrorS(
"ERROR opening socket");
1187 }
1188 memset((char *) &serv_addr,0, sizeof(serv_addr));
1189 portno = 1025;
1190 serv_addr.sin_family = AF_INET;
1191 serv_addr.sin_addr.s_addr = INADDR_ANY;
1192 do
1193 {
1194 portno++;
1195 serv_addr.sin_port = htons(portno);
1196 if(portno > 50000)
1197 {
1198 WerrorS(
"ERROR on binding (no free port available?)");
1202 }
1203 }
1204 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1205
1206 listen(sockfd,1);
1207 char* cli_host = (
char*)
omAlloc(256);
1208 char* path = (
char*)
omAlloc(1024);
1209 int r = si_sscanf(
l->name,
"%255[^:]:%s",cli_host,path);
1210 if(r == 0)
1211 {
1212 WerrorS(
"ERROR: no host specified");
1219 }
1220 else if(r == 1)
1221 {
1222 WarnS(
"program not specified, using /usr/local/bin/Singular");
1224 strcpy(path,"/usr/local/bin/Singular");
1225 }
1226 char* ssh_command = (
char*)
omAlloc(256);
1227 char* ser_host = (
char*)
omAlloc(64);
1228 gethostname(ser_host,64);
1229 if (strcmp(cli_host,"localhost")==0)
1230 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1231 else
1232 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1233
1237 system(ssh_command);
1240 clilen = sizeof(cli_addr);
1241 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1242 if(newsockfd < 0)
1243 {
1249 }
1250
1254 d->
f_write = fdopen(newsockfd,
"w");
1255 si_close(sockfd);
1264 }
1265
1266 else if(strcmp(mode,"connect")==0)
1267 {
1268 char* host = (
char*)
omAlloc(256);
1269 int sockfd, portno;
1270 struct sockaddr_in serv_addr;
1271 struct hostent *server;
1272
1273 si_sscanf(
l->name,
"%255[^:]:%d",host,&portno);
1274
1275 if (portno!=0)
1276 {
1277 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1278 if (sockfd < 0)
1279 {
1280 WerrorS(
"ERROR opening socket");
1283 }
1284 server = gethostbyname(host);
1286 {
1287 WerrorS(
"ERROR, no such host");
1290 }
1291 memset((char *) &serv_addr, 0, sizeof(serv_addr));
1292 serv_addr.sin_family = AF_INET;
1293 memcpy((char *)&serv_addr.sin_addr.s_addr,
1294 (char *)server->h_addr,
1295 server->h_length);
1296 serv_addr.sin_port = htons(portno);
1297 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
1298 {
1299 Werror(
"ERROR connecting(errno=%d)",errno);
1302 }
1303
1306 d->
f_write=fdopen(sockfd,
"w");
1310 }
1311 else
1312 {
1317 }
1318 }
1319
1320 else
1321 {
1322
1323 FILE *outfile;
1324 char *filename=
l->name;
1325
1326 if(filename[0]=='>')
1327 {
1328 if (filename[1]=='>')
1329 {
1330 filename+=2;
1331 mode = "a";
1332 }
1333 else
1334 {
1335 filename++;
1336 mode="w";
1337 }
1338 }
1339 outfile=
myfopen(filename,mode);
1341 {
1342 if (strcmp(
l->mode,
"r")==0)
1343 {
1344 fclose(outfile);
1346 }
1347 else
1348 {
1351 }
1352 }
1353 else
1354 {
1359 }
1360 }
1361 }
1362 }
1363
1365}
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