Nife version Beta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

1060 lines
24 KiB

  1. /* Copyright (C) 2011-2015 Patrick H. E. Foubet - S.E.R.I.A.N.E.
  2. This program is free software: you can redistribute it and/or modify
  3. it under the terms of the GNU General Public License as published by
  4. the Free Software Foundation, either version 3 of the License, or any
  5. later version.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  9. GNU General Public License for more details.
  10. You should have received a copy of the GNU General Public License
  11. along with this program. If not, see <http://www.gnu.org/licenses/>
  12. *******************************************************************/
  13. /* net.c */
  14. #include "conf.h"
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <strings.h>
  19. #include <sys/types.h>
  20. #include <sys/time.h>
  21. #include <sys/socket.h>
  22. #include <signal.h>
  23. #include <sys/stat.h>
  24. #include <fcntl.h>
  25. #include <unistd.h>
  26. /*
  27. */
  28. #include <netinet/in.h>
  29. #include <arpa/inet.h>
  30. #include <netdb.h>
  31. #include "nife.h"
  32. #include "mth.h"
  33. #include "net.h"
  34. #include "lib.h"
  35. #include "debug.h"
  36. #include "stackC.h"
  37. #include "stackN.h"
  38. #include "stackL.h"
  39. #include "foncs.h"
  40. #include "scs.h"
  41. #include "err.h"
  42. #define LOCALS "localhost"
  43. #define MAXCLI 200
  44. #define LLIB 24
  45. static char *NetName=NULL;
  46. /* for messages */
  47. struct Mess1 {
  48. uint32_t pid;
  49. union {
  50. char lib[LLIB];
  51. in_port_t port;
  52. };
  53. };
  54. /* RPC structures */
  55. struct Nrpc {
  56. uint32_t nkey; /* netkey */
  57. char fct[LLIB]; /* function */
  58. struct Nrpc *next;
  59. };
  60. /* Table for Server */
  61. struct Client {
  62. uint32_t pid;
  63. long long dt; /* delta time local - remote */
  64. struct in_addr ip; /* net order */
  65. in_port_t port; /* Nrpc port in net order */
  66. struct Nrpc *ff; /* first function */
  67. char lib[LLIB];
  68. } TCli[MAXCLI];
  69. static int NCli, STS=0, SameSaS=0;
  70. static void initCli(void)
  71. {
  72. int i;
  73. for(i=0;i<MAXCLI;i++) TCli[i].pid=0;
  74. NCli=0;
  75. }
  76. static int addCli(uint32_t pid, struct in_addr ip, char *lib, long long dt)
  77. {
  78. int i;
  79. if (NCli==MAXCLI) return -1;
  80. for(i=0;i<MAXCLI;i++)
  81. if (TCli[i].pid == 0) break;
  82. TCli[i].pid = pid;
  83. TCli[i].dt = dt;
  84. TCli[i].port = 0;
  85. TCli[i].ff = (struct Nrpc*)NULL;
  86. TCli[i].ip.s_addr = ip.s_addr;
  87. strncpy(TCli[i].lib,lib,LLIB-1);
  88. TCli[i].lib[LLIB-1] = '\0';
  89. NCli++;
  90. return 0;
  91. }
  92. static void delCli(int pid, struct in_addr ip)
  93. {
  94. int i;
  95. for(i=0;i<MAXCLI;i++)
  96. if ((TCli[i].pid == pid) && (TCli[i].ip.s_addr == ip.s_addr)) {
  97. TCli[i].pid = 0;
  98. TCli[i].lib[0] = '\0';
  99. NCli--;
  100. break;
  101. }
  102. }
  103. static void majNRP(int pid, in_port_t p)
  104. {
  105. int i;
  106. for(i=0;i<MAXCLI;i++)
  107. if (TCli[i].pid == pid) {
  108. TCli[i].port = p;
  109. break;
  110. }
  111. }
  112. static long long getDt(int pid, struct in_addr ip)
  113. {
  114. int i;
  115. for(i=0;i<MAXCLI;i++)
  116. if ((TCli[i].pid == pid) && (TCli[i].ip.s_addr == ip.s_addr))
  117. return TCli[i].dt;
  118. return 0;
  119. }
  120. static int getCliId(char *N)
  121. {
  122. int i;
  123. for(i=0;i<MAXCLI;i++)
  124. if (strcmp(TCli[i].lib,N) == 0)
  125. return i;
  126. return -1;
  127. }
  128. static void listCli(void)
  129. {
  130. int i,j=0;
  131. char S;
  132. for(i=0;i<MAXCLI;i++)
  133. if (TCli[i].pid != 0) {
  134. j++;
  135. if (TCli[i].dt == 0) S='=';
  136. else {
  137. if (TCli[i].dt > 0) S='+'; else S='-';
  138. }
  139. printf("%3d : %6d %15s:%d %c %s\n",j,TCli[i].pid,inet_ntoa(TCli[i].ip),
  140. (int)ntohs(TCli[i].port), S, TCli[i].lib);
  141. /* with dt */
  142. /*
  143. printf("%3d : %6d %15s %15ld %s\n",j,TCli[i].pid,inet_ntoa(TCli[i].ip),
  144. (long)TCli[i].dt, TCli[i].lib);
  145. */
  146. }
  147. }
  148. #define SERV_PORT 32011 /* Stack to Stack Protocol port */
  149. /* commands list (default 1+1) */
  150. #define NET_SLI '?' /* ask the stack list */
  151. #define NET_DRS '-' /* 1+0 drop net stack */
  152. #define NET_ONR 'a' /* remote login */
  153. #define NET_ON 'A' /* login */
  154. #define NET_CAL 'C' /* calcul of dt */
  155. #define NET_DPH 'd' /* depth */
  156. #define NET_DAT 'D' /* data */
  157. #define NET_OFF 'E' /* logoff */
  158. #define NET_U2S 'F' /* From user to server */
  159. #define NET_FIL 'f' /* ok to send file */
  160. #define NET_GDT 'G' /* get dt */
  161. #define NET_LI 'L' /* ask the list */
  162. #define NET_NRP 'N' /* NRpc Port */
  163. #define NET_PAR 'P' /* call distant parser */
  164. #define NET_RUS 'R' /* ask to Ressources Usage */
  165. #define NET_STS 'S' /* ask to Stop The Server */
  166. #define NET_S2U 'T' /* from server To user */
  167. #define NET_EXE 'X' /* send a RPC command */
  168. #define NET_ERR 'Z' /* Error */
  169. #define NET_EOM (char)3 /* End Of Message */
  170. #define LNBUF 200
  171. #define LNSRV 24
  172. char NetServer[24]=LOCALS;
  173. static int Sock, NET=0;
  174. static struct sockaddr_in Sin, SinSav;
  175. static int connSock2(int n) /* connect to Nife RPC Client */
  176. {
  177. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) return 1;
  178. bcopy(&SinSav,&Sin,sizeof(Sin));
  179. bcopy(&TCli[n].ip,&Sin.sin_addr,sizeof(Sin.sin_addr));
  180. bcopy(&TCli[n].port,&Sin.sin_port,sizeof(Sin.sin_port));
  181. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) return 1;
  182. return 0; /* OK */
  183. }
  184. void IF_Me(void)
  185. {
  186. char * Me;
  187. void * NM;
  188. int i=0;
  189. static char *ve[] = { "NIFENAME", "LOGNAME", "USERNAME", "USER", "" };
  190. static char Nobody[] = "Nobody";
  191. if (NetName == NULL) {
  192. Me=NULL;
  193. while (Me == NULL) {
  194. if (strlen(ve[i])==0) break;
  195. Me = getenv(ve[i++]);
  196. }
  197. if (Me == NULL) Me=Nobody;
  198. if ((NM = malloc(strlen(Me)+1)) != NULL)
  199. strcpy((char*)NM,Me);
  200. NetName=(char*)NM;
  201. }
  202. putString(NetName);
  203. }
  204. void IF_NetServer(void)
  205. {
  206. char *s;
  207. int i;
  208. if (!isNString(1)) {
  209. messErr(6); return;
  210. }
  211. s = getString();
  212. i=LNSRV-1;
  213. strncpy(NetServer,s,i);
  214. NetServer[i]='\0';
  215. free((void*)s);
  216. }
  217. static void stopServ(int TS, char * m, int n)
  218. {
  219. char buf[20];
  220. perror(m);
  221. if (TS) sprintf(buf,"main_Serv : Erreur %d %s\n",n,m);
  222. else sprintf(buf,"main_Nrpc : Erreur %d %s\n",n,m);
  223. D_Trace(buf);
  224. exit(n);
  225. }
  226. static char NET_BUF[LNBUF];
  227. static int readMess(int s)
  228. {
  229. char * b, *f;
  230. b = NET_BUF;
  231. f = b + LNBUF - 1;
  232. while (1) {
  233. if (read(s,(void*)b,1) <= 0) break;
  234. if (*b == NET_EOM) break;
  235. b++;
  236. if (b>f) { b--; break; }
  237. }
  238. if (*b != NET_EOM) return -1;
  239. b++;
  240. return(b-NET_BUF);
  241. }
  242. static void readAff(int s, char C)
  243. {
  244. char b[2];
  245. int ok=0;
  246. if (read(s,(void*)b,1) <= 0) return;
  247. if (*b == C) ok=1;
  248. while (*b != NET_EOM) {
  249. if (read(s,(void*)b,1) <= 0) break;
  250. else {
  251. if (ok) write(1,(void*)b,1);
  252. }
  253. }
  254. }
  255. static void sendC(char c)
  256. {
  257. write(Sock,(void*)&c,1);
  258. }
  259. static void sendBuf(int s, void * b, size_t no)
  260. {
  261. write(s,b,no);
  262. }
  263. static void rcvBuf(int s, void * b, uint32_t no)
  264. {
  265. int r,ar;
  266. void *t;
  267. ar = no;
  268. r = 0;
  269. t = b;
  270. while ((r=read(s,t,ar)) != ar) {
  271. if (r<0) break;
  272. ar -= r;
  273. t += r;
  274. }
  275. }
  276. void sendData(int s, void * b, uint32_t n)
  277. {
  278. char c;
  279. c=NET_DAT;
  280. write(s,(void*)&c,1);
  281. n -= lAdrNum(); /* don't send the addresse */
  282. sendBuf(s,&n,sizeof(n));
  283. /* sendBuf(s,b,(size_t)n); */
  284. sendBuf(s,b,sizeof(uint32_t)*2);
  285. b+=(sizeof(uint32_t)*2)+lAdrNum();
  286. n-=(sizeof(uint32_t)*2);
  287. sendBuf(s,b,(size_t)n);
  288. }
  289. void sendDataC(void *b, uint32_t n)
  290. {
  291. sendData(Sock,b,n);
  292. }
  293. void sendFile(int s, int fid)
  294. {
  295. int n;
  296. char Buf[LNBUF];
  297. while ((n = read(fid,(void*)Buf,LNBUF)) > 0)
  298. sendBuf(s,(void*)Buf,(size_t)n);
  299. close(fid);
  300. }
  301. static void sendInsc(void)
  302. {
  303. char *s;
  304. struct Mess1 M1;
  305. uint32_t scs;
  306. struct timeval tv;
  307. long long v;
  308. scs = getScs();
  309. s = getString();
  310. M1.pid = getpid();
  311. strncpy(M1.lib,s,LLIB-1);
  312. M1.lib[LLIB-1]='\0';
  313. if (SameSaS) sendC(NET_ON);
  314. else sendC(NET_ONR);
  315. write(Sock,(void*)&scs,sizeof(scs));
  316. write(Sock,(void*)&M1,sizeof(M1));
  317. sendC(NET_EOM);
  318. /* update NetName */
  319. if (NetName != NULL) free((void*)NetName);
  320. NetName=s;
  321. if (SameSaS==0) {
  322. if (readMess(Sock) == 2) {
  323. if (*NET_BUF == (NET_CAL)) {
  324. gettimeofday(&tv,NULL);
  325. v=Nife_time(tv);
  326. sendC(NET_CAL+1);
  327. write(Sock,(void*)&v,sizeof(v));
  328. sendC(NET_EOM);
  329. }
  330. }
  331. } else SameSaS=0;
  332. }
  333. static void sendGetStd(char Code)
  334. {
  335. struct Mess1 M1;
  336. switch(Code) {
  337. case NET_OFF :
  338. case NET_GDT :
  339. M1.pid = getpid();
  340. break;
  341. default :
  342. M1.pid = NetKey;
  343. }
  344. strcpy(M1.lib,"-");
  345. sendC(Code);
  346. write(Sock,(void*)&M1,sizeof(M1));
  347. sendC(NET_EOM);
  348. }
  349. static void sendNrpcPort(in_port_t P)
  350. {
  351. struct Mess1 M1;
  352. M1.pid = getppid(); /* parent pid ! */
  353. M1.port = P;
  354. sendC(NET_NRP);
  355. write(Sock,(void*)&M1,sizeof(M1));
  356. sendC(NET_EOM);
  357. }
  358. static void send1car(int s, char c)
  359. {
  360. char b[2];
  361. b[0]=c;
  362. b[1]=NET_EOM;
  363. write(s,b,2);
  364. }
  365. void NTraceM1(char * A)
  366. {
  367. struct Mess1 M1;
  368. char buf[50];
  369. bcopy((void*)(A+1),(void*)&M1,sizeof(M1));
  370. sprintf(buf,"TraceM1 %c %d %s !",*A, M1.pid, M1.lib);
  371. D_Trace(buf);
  372. }
  373. void NTraceData(char A, long n)
  374. {
  375. char buf[50];
  376. sprintf(buf,"TraceData %c %ld !",A, n);
  377. D_Trace(buf);
  378. }
  379. static void RemotExecBegin(long long k)
  380. {
  381. putLong(k);
  382. IF_NetKey();
  383. IF_netS2U();
  384. IF_netDropS();
  385. }
  386. static void RemotExecEnd(void)
  387. {
  388. if (noErr()) {
  389. razErr();
  390. IF_stack_clear(); /* clear all stacks */
  391. IF_stackL_clear();
  392. IF_stackC_clear();
  393. IF_NetErrVal();
  394. }
  395. IF_depth();
  396. IF_netU2S();
  397. IF_stack_clear(); /* don't eat any bread ! */
  398. IF_stackL_clear();
  399. IF_stackC_clear();
  400. }
  401. static void net_servrpc(int s)
  402. {
  403. int i, j, fid;
  404. uint32_t k;
  405. char *sF, nF[30];
  406. i=readMess(s);
  407. NET_BUF[i]='\0';
  408. D_TraceH(NET_BUF,i); /* to debug */
  409. switch(*NET_BUF) {
  410. case NET_OFF :
  411. send1car(s, NET_OFF+1);
  412. D_Close();
  413. exit(0); /* stop the Nrpc client */
  414. break;
  415. case NET_EXE :
  416. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  417. sF = (char *)(NET_BUF+sizeof(k)+1);
  418. /* execute the function call */
  419. /* fprintf(stderr,"Nife_RPC : %s NetKey=%x !\n",sF,k);*/
  420. RemotExecBegin((long long)k);
  421. if (!execLibNrpc(sF)) IF_NetErrVal();
  422. RemotExecEnd();
  423. break;
  424. case NET_PAR :
  425. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  426. sprintf(nF,"w_%d.nif",getpid());
  427. if ((fid = open(nF,O_CREAT|O_TRUNC|O_RDWR,0600)) != -1) {
  428. j=1;
  429. while ((j==1) && ((i=read(s,NET_BUF,LNBUF)) > 0)) {
  430. if (NET_BUF[i-1] == NET_EOM){
  431. j=0; i--;
  432. }
  433. write(fid, NET_BUF, i);
  434. }
  435. close(fid);
  436. RemotExecBegin((long long)k);
  437. compileFile(nF);
  438. RemotExecEnd();
  439. unlink(nF);
  440. }
  441. break;
  442. default :
  443. break;
  444. }
  445. }
  446. static void net_service(int s)
  447. {
  448. int i, CalDT=0;
  449. uint32_t n, k,scs;
  450. void *M;
  451. struct Mess1 M1;
  452. struct timeval tv;
  453. long long v1, v2, vm, vr, dt;
  454. char c, *sN, *sF;
  455. i=readMess(s);
  456. NET_BUF[i]='\0';
  457. D_TraceH(NET_BUF,i); /* for debug */
  458. switch(*NET_BUF) {
  459. case NET_ONR :
  460. CalDT=1;
  461. case NET_ON :
  462. /* NTraceM1(NET_BUF); */
  463. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  464. scs = getScs();
  465. if (k==scs) {
  466. bcopy((void*)(NET_BUF+sizeof(k)+1),(void*)&M1,sizeof(M1));
  467. if (CalDT) {
  468. gettimeofday(&tv,NULL);
  469. send1car(s, NET_CAL);
  470. v1=Nife_time(tv);
  471. i=readMess(s);
  472. gettimeofday(&tv,NULL);
  473. v2=Nife_time(tv);
  474. if (*NET_BUF == NET_CAL+1) {
  475. bcopy((void*)(NET_BUF+1),(void*)&vr,sizeof(vr));
  476. vm = v1 + ((v2-v1)/2);
  477. addCli(M1.pid, Sin.sin_addr, M1.lib, (int)(vm-vr));
  478. }
  479. else
  480. addCli(M1.pid, Sin.sin_addr, M1.lib, -9);
  481. send1car(s, NET_ON+1);
  482. } else {
  483. addCli(M1.pid, Sin.sin_addr, M1.lib, 0);
  484. send1car(s, NET_ON+1);
  485. }
  486. }
  487. else
  488. send1car(s, NET_OFF);
  489. break;
  490. case NET_OFF :
  491. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  492. delCli(M1.pid, Sin.sin_addr);
  493. send1car(s, NET_OFF+1);
  494. if (STS) {
  495. if (NCli == 0) {
  496. D_Close();
  497. exit(0); /* stop the server */
  498. }
  499. STS=0;
  500. }
  501. break;
  502. case NET_NRP :
  503. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  504. majNRP(M1.pid, M1.port);
  505. send1car(s, NET_NRP+1);
  506. break;
  507. case NET_DPH :
  508. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  509. dt=NetDepth(M1.pid);
  510. c=*NET_BUF+1;
  511. write(s,(void*)&c,1);
  512. write(s,(void*)&dt,sizeof(dt));
  513. c=NET_EOM;
  514. write(s,(void*)&c,1);
  515. break;
  516. case NET_GDT :
  517. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  518. dt=getDt(M1.pid, Sin.sin_addr);
  519. c=*NET_BUF+1;
  520. write(s,(void*)&c,1);
  521. write(s,(void*)&dt,sizeof(dt));
  522. c=NET_EOM;
  523. write(s,(void*)&c,1);
  524. break;
  525. case NET_EXE :
  526. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  527. sN = (char *)(NET_BUF+sizeof(k)+1);
  528. sF = sN+strlen(sN)+1;
  529. if (strlen(sN)>=LLIB) sN[LLIB-1]='\0';
  530. i=getCliId(sN);
  531. if (i>=0) {
  532. send1car(s, NET_EXE+1);
  533. /* send the call */
  534. if (!connSock2(i)) {
  535. sendC(NET_EXE);
  536. sendBuf(Sock,(void*)&k, sizeof(k));
  537. sendBuf(Sock,(void*)sF, strlen(sF)+1);
  538. sendC(NET_EOM);
  539. }
  540. }
  541. else send1car(s, NET_ERR);
  542. break;
  543. case NET_PAR :
  544. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  545. sN = (char *)(NET_BUF+sizeof(k)+1);
  546. if (strlen(sN)>=LLIB) sN[LLIB-1]='\0';
  547. i=getCliId(sN);
  548. if (i>=0) {
  549. /* connect to client */
  550. if (!connSock2(i)) {
  551. send1car(s, NET_FIL); /* tell ok to sender */
  552. sendC(NET_PAR);
  553. sendBuf(Sock,(void*)&k, sizeof(k));
  554. sendC(NET_EOM);
  555. while ((i=read(s,NET_BUF,LNBUF)) > 0) {
  556. sendBuf(Sock, NET_BUF, i);
  557. if (NET_BUF[i-1] == NET_EOM) break;
  558. }
  559. send1car(s, NET_PAR+1);
  560. }
  561. else send1car(s, NET_ERR);
  562. }
  563. else send1car(s, NET_ERR);
  564. break;
  565. case NET_STS :
  566. STS=1;
  567. send1car(s, NET_STS+1);
  568. break;
  569. case NET_DRS :
  570. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  571. IF_netDrop(k);
  572. break;
  573. case NET_LI :
  574. c=*NET_BUF+1;
  575. write(s,(void*)&c,1);
  576. dup2(s,1);
  577. listCli();
  578. close(1);
  579. c=NET_EOM;
  580. write(s,(void*)&c,1);
  581. break;
  582. case NET_SLI :
  583. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  584. c=*NET_BUF+1;
  585. write(s,(void*)&c,1);
  586. dup2(s,1);
  587. IF_show_netStack(k);
  588. close(1);
  589. c=NET_EOM;
  590. write(s,(void*)&c,1);
  591. break;
  592. case NET_RUS :
  593. c=*NET_BUF+1;
  594. write(s,(void*)&c,1);
  595. dup2(s,1);
  596. IF_resUsage();
  597. close(1);
  598. c=NET_EOM;
  599. write(s,(void*)&c,1);
  600. break;
  601. case NET_U2S :
  602. while (1) {
  603. read(s,(void*)&c,1);
  604. if (c == NET_EOM) break;
  605. if (c != NET_DAT) {
  606. D_Trace("Erreur NET_DAT !"); break;
  607. }
  608. read(s,(void*)&n,sizeof(n));
  609. /* NTraceData(c, n);*/
  610. /* add the addresse */
  611. if ((M = malloc((size_t)n+lAdrNum())) != NULL) {
  612. rcvBuf(s,M,(sizeof(uint32_t)*2));
  613. rcvBuf(s,M+((sizeof(uint32_t)*2)+lAdrNum()),
  614. n-(sizeof(uint32_t)*2));
  615. putVar(M);
  616. }
  617. }
  618. break;
  619. case NET_S2U :
  620. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  621. /* NTraceData(NET_S2U, k);*/
  622. NetToStack(s,k);
  623. c=NET_EOM;
  624. write(s,(void*)&c,1);
  625. break;
  626. default :
  627. break;
  628. }
  629. }
  630. static int connSock(void)
  631. {
  632. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  633. messErr(31);
  634. return 1;
  635. }
  636. bcopy(&SinSav,&Sin,sizeof(Sin));
  637. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  638. messErr(34);
  639. return 1;
  640. }
  641. return 0; /* OK */
  642. }
  643. static void InterruptRpc(int S)
  644. {
  645. D_Close();
  646. exit(0);
  647. }
  648. void main_Nrpc(void) /* main function for Nrpc client */
  649. {
  650. int sock, nsock;
  651. socklen_t ln;
  652. struct sockaddr_in Nsin;
  653. signal(SIGTERM, InterruptRpc);
  654. if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  655. stopServ(0, "socket",1);
  656. bzero(&Nsin,sizeof(Nsin));
  657. Nsin.sin_family = AF_INET;
  658. if (bind(sock, (struct sockaddr *)&Nsin, sizeof(Nsin)) < 0)
  659. stopServ(0, "bind",2);
  660. /* send Nrpc port */
  661. ln = sizeof(Nsin);
  662. if (getsockname(sock, (struct sockaddr *)&Nsin, &ln) < 0)
  663. stopServ(0, "gsname",3);
  664. if (connSock()) return;
  665. sendNrpcPort(Nsin.sin_port);
  666. if (readMess(Sock) != 2) { messErr(35); return; }
  667. close(Sock);
  668. if (*NET_BUF != (NET_NRP+1)) { messErr(40); return; }
  669. /* listen and wait demands */
  670. if (listen(sock,5) < 0) stopServ(0, "listen",4);
  671. ln = sizeof(Nsin);
  672. for (;;) {
  673. if((nsock=accept(sock,(struct sockaddr *)&Nsin,(socklen_t*)&ln)) < 0)
  674. stopServ(0, "accept",5);
  675. net_servrpc(nsock);
  676. close(nsock);
  677. }
  678. }
  679. int Nrpc_pid=-1;
  680. static void startNrpc(void)
  681. {
  682. if ((Nrpc_pid = fork()) == -1) stopErr("startNrpc","fork");
  683. if (Nrpc_pid == 0) { /* fils */
  684. close(0);
  685. close(1);
  686. /* close(2); */
  687. if (Debug) Debug=3;
  688. D_Reset();
  689. IF_stack_clear(); /* clear all stacks */
  690. IF_stackL_clear();
  691. IF_stackC_clear();
  692. main_Nrpc();
  693. exit(1);
  694. }
  695. }
  696. void main_Serv(void) /* main function of Server */
  697. {
  698. int ln, sock, nsock;
  699. initCli();
  700. if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  701. stopServ(1, "socket",1);
  702. bzero(&Sin.sin_addr,sizeof(Sin.sin_addr));
  703. if (bind(sock, (struct sockaddr *)&Sin, sizeof(Sin)) < 0)
  704. stopServ(1, "bind",2);
  705. if (listen(sock,5) < 0) stopServ(1, "listen",3);
  706. ln = sizeof(Sin);
  707. for (;;) {
  708. if((nsock=accept(sock,(struct sockaddr *)&Sin,(socklen_t*)&ln)) < 0)
  709. stopServ(1, "accept",4);
  710. net_service(nsock);
  711. close(nsock);
  712. }
  713. }
  714. static void startServer(void)
  715. {
  716. int pid;
  717. if ((pid = fork()) == -1) stopErr("startServer","fork");
  718. if (pid == 0) { /* fils */
  719. setsid();
  720. close(0);
  721. close(1);
  722. /* close(2); */
  723. if (Debug) Debug=2;
  724. D_Reset();
  725. close(Sock);
  726. IF_stack_clear(); /* clear all stacks */
  727. IF_stackL_clear();
  728. IF_stackC_clear();
  729. main_Serv();
  730. }
  731. sleep(2); /* wait for server initialization */
  732. }
  733. static void IF_netGetVal (char Code)
  734. {
  735. long long v;
  736. if (NET) {
  737. if (connSock()) return;
  738. sendGetStd(Code);
  739. if (readMess(Sock) != 2+sizeof(v)) { messErr(35); return; }
  740. close(Sock);
  741. if (*NET_BUF != (Code+1)) { messErr(40); return; }
  742. bcopy((void*)(NET_BUF+1),(void*)&v,sizeof(v));
  743. putLong(v);
  744. } else messErr(32);
  745. }
  746. void IF_netDt (void)
  747. {
  748. IF_netGetVal(NET_GDT);
  749. }
  750. void IF_netDepth (void)
  751. {
  752. IF_netGetVal(NET_DPH);
  753. }
  754. void IF_netOff (void)
  755. {
  756. if (NET) {
  757. if (connSock()) return;
  758. sendGetStd(NET_OFF);
  759. if (readMess(Sock) != 2) { messErr(35); return; }
  760. close(Sock);
  761. if (*NET_BUF != (NET_OFF+1)) { messErr(40); return; }
  762. if (Nrpc_pid > -1) { /* stop Nrpc local server */
  763. kill(Nrpc_pid, SIGTERM);
  764. Nrpc_pid=-1;
  765. }
  766. NET=0;
  767. }
  768. }
  769. void IF_netOn (void)
  770. {
  771. struct hostent *h;
  772. if (!isNString(1)) {
  773. messErr(6); return;
  774. }
  775. if (NET) {
  776. IF_dropC(); return;
  777. }
  778. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != -1) {
  779. if(!(h=gethostbyname(NetServer))) {
  780. messErr(33);
  781. return;
  782. }
  783. bzero(&Sin,sizeof(Sin));
  784. Sin.sin_family = AF_INET;
  785. bcopy(h->h_addr,&Sin.sin_addr,h->h_length);
  786. Sin.sin_port = htons(SERV_PORT);
  787. bcopy(&Sin,&SinSav,sizeof(Sin));
  788. if (strcmp(NetServer,LOCALS) == 0) /* localhost */
  789. SameSaS=1; /* same system as server */
  790. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  791. if (strcmp(NetServer,LOCALS) != 0) { /* not localhost */
  792. messErr(34);
  793. return;
  794. }
  795. /* Server is absent : fork it ! */
  796. startServer();
  797. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  798. messErr(34);
  799. return;
  800. }
  801. }
  802. sendInsc();
  803. if (readMess(Sock) != 2) { messErr(35); return; }
  804. close(Sock);
  805. if (*NET_BUF == (NET_OFF)) { messErr(38); return; }
  806. if (*NET_BUF != (NET_ON+1)) { messErr(40); return; }
  807. NET=1; /* net on !! */
  808. /* start RPC local server */
  809. startNrpc();
  810. } else messErr(31);
  811. }
  812. void IF_netExec (void)
  813. {
  814. char *sN, *sF;
  815. if (!isNString(2)) {
  816. messErr(6); return;
  817. }
  818. sN=getString();
  819. sF=getString();
  820. if (NET) {
  821. if (!connSock()) {
  822. sendC(NET_EXE);
  823. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  824. sendBuf(Sock,(void*)sN, strlen(sN)+1);
  825. sendBuf(Sock,(void*)sF, strlen(sF)+1);
  826. sendC(NET_EOM);
  827. if (readMess(Sock) != 2) messErr(35);
  828. close(Sock);
  829. if (*NET_BUF != (NET_EXE+1)) {
  830. if (*NET_BUF == (NET_ERR)) messErr(41);
  831. else messErr(40);
  832. }
  833. }
  834. }
  835. free((void*)sN);
  836. free((void*)sF);
  837. }
  838. void IF_netCompile (void)
  839. {
  840. char *sN, *sF;
  841. int fid;
  842. if (!isNString(2)) {
  843. messErr(6); return;
  844. }
  845. sN=getString();
  846. sF=getString();
  847. if ((fid=open(sF,O_RDONLY)) == -1) messErr(43);
  848. else
  849. if (NET) {
  850. if (!connSock()) {
  851. sendC(NET_PAR);
  852. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  853. sendBuf(Sock,(void*)sN, strlen(sN)+1);
  854. sendC(NET_EOM);
  855. /* wait for invitation */
  856. if (readMess(Sock) != 2) messErr(35);
  857. else {
  858. if (*NET_BUF == (NET_FIL)) {
  859. sendFile(Sock, fid);
  860. sendC(NET_EOM);
  861. if (readMess(Sock) != 2) messErr(35);
  862. }
  863. }
  864. close(Sock);
  865. if (*NET_BUF != (NET_PAR+1)) {
  866. if (*NET_BUF == (NET_ERR)) messErr(41);
  867. else messErr(40);
  868. }
  869. }
  870. }
  871. free((void*)sN);
  872. free((void*)sF);
  873. }
  874. void IF_netList (void)
  875. {
  876. if (NET) {
  877. if (connSock()) return;
  878. send1car(Sock,NET_LI);
  879. readAff(Sock, NET_LI+1);
  880. close(Sock);
  881. }
  882. printf("<end of net list>\n");
  883. }
  884. void IFD_netList (void)
  885. {
  886. _IFD_BEGIN_
  887. IF_netList();
  888. _IFD_END_
  889. }
  890. void IF_netStackList (void)
  891. {
  892. if (NET) {
  893. if (connSock()) return;
  894. sendC(NET_SLI);
  895. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  896. sendC(NET_EOM);
  897. readAff(Sock, NET_SLI+1);
  898. close(Sock);
  899. }
  900. }
  901. void IFD_netStackList (void)
  902. {
  903. _IFD_BEGIN_
  904. IF_netStackList();
  905. _IFD_END_
  906. }
  907. void IF_netDropS (void)
  908. {
  909. if (NET) {
  910. if (NetKey == UNI_KEY) {
  911. messErr(37);
  912. return;
  913. }
  914. if (connSock()) return;
  915. sendC(NET_DRS);
  916. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  917. sendC(NET_EOM);
  918. close(Sock);
  919. }
  920. }
  921. void IF_netRusage (void)
  922. {
  923. if (NET) {
  924. if (connSock()) return;
  925. send1car(Sock,NET_RUS);
  926. readAff(Sock, NET_RUS+1);
  927. close(Sock);
  928. }
  929. printf("<end of server ressources usage>\n");
  930. }
  931. void IF_netStopS (void)
  932. {
  933. if (NET) {
  934. if (connSock()) return;
  935. send1car(Sock,NET_STS);
  936. if (readMess(Sock) != 2) { messErr(35); return; }
  937. close(Sock);
  938. if (*NET_BUF != (NET_STS+1)) { messErr(40); return; }
  939. }
  940. }
  941. void IF_netU2S(void)
  942. {
  943. long n;
  944. if (NET) {
  945. if (!getParLong(&n)) return;
  946. if (n==0) return;
  947. if (NetKey == UNI_KEY) {
  948. messErr(37);
  949. return;
  950. }
  951. if (connSock()) return;
  952. send1car(Sock,NET_U2S);
  953. StackToNet(n);
  954. sendC(NET_EOM);
  955. close(Sock);
  956. } else messErr(32);
  957. }
  958. void IF_netS2U(void)
  959. {
  960. uint32_t n;
  961. void *M;
  962. char c;
  963. if (NET) {
  964. if (connSock()) return;
  965. sendC(NET_S2U);
  966. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  967. sendC(NET_EOM);
  968. while (1) {
  969. read(Sock,(void*)&c,1);
  970. if (c == NET_EOM) break;
  971. if (c != NET_DAT) {
  972. messErr(40); break;
  973. }
  974. read(Sock,(void*)&n,sizeof(n));
  975. /* add the addresse */
  976. if ((M = malloc((size_t)n+lAdrNum())) != NULL) {
  977. rcvBuf(Sock,M,(sizeof(uint32_t)*2));
  978. rcvBuf(Sock,M+((sizeof(uint32_t)*2)+lAdrNum()),
  979. n-(sizeof(uint32_t)*2));
  980. putVar(M);
  981. } else stopErr("IF_netS2U","malloc");
  982. }
  983. close(Sock);
  984. } else messErr(32);
  985. }