958{
960 {
961 const char *mode;
964 {
965 if (
l->mode[0] !=
'\0' && (strcmp(
l->mode,
"r") == 0))
968 }
969
971 else if (strcmp(
l->mode,
"w") == 0) mode =
"w";
972 else if (strcmp(
l->mode,
"fork") == 0) mode =
"fork";
973 else if (strcmp(
l->mode,
"tcp") == 0) mode =
"tcp";
974 else if (strcmp(
l->mode,
"connect") == 0) mode =
"connect";
975 else mode = "a";
976
977
983
984 if (
l->name[0] ==
'\0')
985 {
986 if (strcmp(mode,"fork")==0)
987 {
993
994 int pc[2];
995 int cp[2];
996 pipe(pc);
997 pipe(cp);
998 pid_t pid = fork();
999 if (pid == -1 && errno == EAGAIN)
1000 {
1002 pid = fork();
1003 }
1004 if (pid == -1)
1005 {
1007 }
1008 if (pid==0)
1009 {
1010
1011 sigset_t sigint;
1012 sigemptyset(&sigint);
1013 sigaddset(&sigint, SIGINT);
1014 sigprocmask(SIG_BLOCK, &sigint,
NULL);
1015
1017
1019
1021 {
1031 hh=nn;
1032 }
1034#ifdef HAVE_SIMPLEIPC
1036#endif
1037 si_close(pc[1]); si_close(cp[0]);
1042
1043
1049
1052 {
1055 }
1057 {
1062 {
1063
1066 }
1070 }
1071
1072 }
1073 else if (pid>0)
1074 {
1076 si_close(pc[0]); si_close(cp[1]);
1083
1084
1085 }
1086 else
1087 {
1088 Werror(
"fork failed (%d)",errno);
1092 }
1093 }
1094
1095 else if (strcmp(mode,"tcp")==0)
1096 {
1097 int sockfd, newsockfd, portno, clilen;
1098 struct sockaddr_in serv_addr, cli_addr;
1099 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1100 if(sockfd < 0)
1101 {
1102 WerrorS(
"ERROR opening socket");
1107 }
1108 memset((char *) &serv_addr,0, sizeof(serv_addr));
1109 portno = 1025;
1110 serv_addr.sin_family = AF_INET;
1111 serv_addr.sin_addr.s_addr = INADDR_ANY;
1112 do
1113 {
1114 portno++;
1115 serv_addr.sin_port = htons(portno);
1116 if(portno > 50000)
1117 {
1118 WerrorS(
"ERROR on binding (no free port available?)");
1123 }
1124 }
1125 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1127 listen(sockfd,1);
1128 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1129 if(newsockfd < 0)
1130 {
1136 }
1137 PrintS(
"client accepted\n");
1141 d->
f_write = fdopen(newsockfd,
"w");
1143 si_close(sockfd);
1144 }
1145
1146 else
1147 {
1148 Werror(
"invalid mode >>%s<< for ssi",mode);
1153 }
1154 }
1155
1156 else
1157 {
1158
1159 if(strcmp(mode,"tcp")==0)
1160 {
1161 int sockfd, newsockfd, portno, clilen;
1162 struct sockaddr_in serv_addr, cli_addr;
1163 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1164 if(sockfd < 0)
1165 {
1166 WerrorS(
"ERROR opening socket");
1171 }
1172 memset((char *) &serv_addr,0, sizeof(serv_addr));
1173 portno = 1025;
1174 serv_addr.sin_family = AF_INET;
1175 serv_addr.sin_addr.s_addr = INADDR_ANY;
1176 do
1177 {
1178 portno++;
1179 serv_addr.sin_port = htons(portno);
1180 if(portno > 50000)
1181 {
1182 WerrorS(
"ERROR on binding (no free port available?)");
1186 }
1187 }
1188 while(bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0);
1189
1190 listen(sockfd,1);
1191 char* cli_host = (
char*)
omAlloc(256);
1192 char* path = (
char*)
omAlloc(1024);
1193 int r = si_sscanf(
l->name,
"%255[^:]:%s",cli_host,path);
1194 if(r == 0)
1195 {
1196 WerrorS(
"ERROR: no host specified");
1203 }
1204 else if(r == 1)
1205 {
1206 WarnS(
"program not specified, using /usr/local/bin/Singular");
1208 strcpy(path,"/usr/local/bin/Singular");
1209 }
1210 char* ssh_command = (
char*)
omAlloc(256);
1211 char* ser_host = (
char*)
omAlloc(64);
1212 gethostname(ser_host,64);
1213 if (strcmp(cli_host,"localhost")==0)
1214 snprintf(ssh_command,256,"%s -q --batch --link=ssi --MPhost=%s --MPport=%d &",path,ser_host,portno);
1215 else
1216 snprintf(ssh_command,256,"ssh %s %s -q --batch --link=ssi --MPhost=%s --MPport=%d &",cli_host,path,ser_host,portno);
1217
1221 system(ssh_command);
1224 clilen = sizeof(cli_addr);
1225 newsockfd = si_accept(sockfd, (struct sockaddr *) &cli_addr, (socklen_t *)&clilen);
1226 if(newsockfd < 0)
1227 {
1233 }
1234
1238 d->
f_write = fdopen(newsockfd,
"w");
1239 si_close(sockfd);
1248 }
1249
1250 else if(strcmp(mode,"connect")==0)
1251 {
1252 char* host = (
char*)
omAlloc(256);
1253 int sockfd, portno;
1254 struct sockaddr_in serv_addr;
1255 struct hostent *server;
1256
1257 si_sscanf(
l->name,
"%255[^:]:%d",host,&portno);
1258
1259 if (portno!=0)
1260 {
1261 sockfd = socket(AF_INET, SOCK_STREAM, 0);
1262 if (sockfd < 0)
1263 {
1264 WerrorS(
"ERROR opening socket");
1267 }
1268 server = gethostbyname(host);
1270 {
1271 WerrorS(
"ERROR, no such host");
1274 }
1275 memset((char *) &serv_addr, 0, sizeof(serv_addr));
1276 serv_addr.sin_family = AF_INET;
1277 memcpy((char *)&serv_addr.sin_addr.s_addr,
1278 (char *)server->h_addr,
1279 server->h_length);
1280 serv_addr.sin_port = htons(portno);
1281 if (si_connect(sockfd,(sockaddr*)&serv_addr,sizeof(serv_addr)) < 0)
1282 {
1283 Werror(
"ERROR connecting(errno=%d)",errno);
1286 }
1287
1290 d->
f_write=fdopen(sockfd,
"w");
1294 }
1295 else
1296 {
1301 }
1302 }
1303
1304 else
1305 {
1306
1307 FILE *outfile;
1308 char *filename=
l->name;
1309
1310 if(filename[0]=='>')
1311 {
1312 if (filename[1]=='>')
1313 {
1314 filename+=2;
1315 mode = "a";
1316 }
1317 else
1318 {
1319 filename++;
1320 mode="w";
1321 }
1322 }
1323 outfile=
myfopen(filename,mode);
1325 {
1326 if (strcmp(
l->mode,
"r")==0)
1327 {
1328 fclose(outfile);
1330 }
1331 else
1332 {
1335 }
1336 }
1337 else
1338 {
1343 }
1344 }
1345 }
1346 }
1347
1349}
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