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.
 
 
 
 

1035 lines
24 KiB

  1. /* Copyright (C) 2011-2014 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_Trace(NET_BUF); */
  409. switch(*NET_BUF) {
  410. case NET_OFF :
  411. send1car(s, NET_OFF+1);
  412. exit(0); /* stop the Nrpc client */
  413. break;
  414. case NET_EXE :
  415. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  416. sF = (char *)(NET_BUF+sizeof(k)+1);
  417. /* execute the function call */
  418. /* fprintf(stderr,"Nife_RPC : %s NetKey=%x !\n",sF,k);*/
  419. RemotExecBegin((long long)k);
  420. if (!execLibNrpc(sF)) IF_NetErrVal();
  421. RemotExecEnd();
  422. break;
  423. case NET_PAR :
  424. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  425. sprintf(nF,"w_%d.nif",getpid());
  426. if ((fid = open(nF,O_CREAT|O_TRUNC|O_RDWR,0600)) != -1) {
  427. j=1;
  428. while ((j==1) && ((i=read(s,NET_BUF,LNBUF)) > 0)) {
  429. if (NET_BUF[i-1] == NET_EOM){
  430. j=0; i--;
  431. }
  432. write(fid, NET_BUF, i);
  433. }
  434. close(fid);
  435. RemotExecBegin((long long)k);
  436. compileFile(nF);
  437. RemotExecEnd();
  438. unlink(nF);
  439. }
  440. break;
  441. default :
  442. break;
  443. }
  444. }
  445. static void net_service(int s)
  446. {
  447. int i, CalDT=0;
  448. uint32_t n, k,scs;
  449. void *M;
  450. struct Mess1 M1;
  451. struct timeval tv;
  452. long long v1, v2, vm, vr, dt;
  453. char c, *sN, *sF;
  454. i=readMess(s);
  455. NET_BUF[i]='\0';
  456. /* D_Trace(NET_BUF); */
  457. switch(*NET_BUF) {
  458. case NET_ONR :
  459. CalDT=1;
  460. case NET_ON :
  461. /* NTraceM1(NET_BUF); */
  462. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  463. scs = getScs();
  464. if (k==scs) {
  465. bcopy((void*)(NET_BUF+sizeof(k)+1),(void*)&M1,sizeof(M1));
  466. if (CalDT) {
  467. gettimeofday(&tv,NULL);
  468. send1car(s, NET_CAL);
  469. v1=Nife_time(tv);
  470. i=readMess(s);
  471. gettimeofday(&tv,NULL);
  472. v2=Nife_time(tv);
  473. if (*NET_BUF == NET_CAL+1) {
  474. bcopy((void*)(NET_BUF+1),(void*)&vr,sizeof(vr));
  475. vm = v1 + ((v2-v1)/2);
  476. addCli(M1.pid, Sin.sin_addr, M1.lib, (int)(vm-vr));
  477. }
  478. else
  479. addCli(M1.pid, Sin.sin_addr, M1.lib, -9);
  480. send1car(s, NET_ON+1);
  481. } else {
  482. addCli(M1.pid, Sin.sin_addr, M1.lib, 0);
  483. send1car(s, NET_ON+1);
  484. }
  485. }
  486. else
  487. send1car(s, NET_OFF);
  488. break;
  489. case NET_OFF :
  490. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  491. delCli(M1.pid, Sin.sin_addr);
  492. send1car(s, NET_OFF+1);
  493. if (STS) {
  494. if (NCli == 0) exit(0); /* stop the server */
  495. STS=0;
  496. }
  497. break;
  498. case NET_NRP :
  499. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  500. majNRP(M1.pid, M1.port);
  501. send1car(s, NET_NRP+1);
  502. break;
  503. case NET_DPH :
  504. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  505. dt=NetDepth(M1.pid);
  506. c=*NET_BUF+1;
  507. write(s,(void*)&c,1);
  508. write(s,(void*)&dt,sizeof(dt));
  509. c=NET_EOM;
  510. write(s,(void*)&c,1);
  511. break;
  512. case NET_GDT :
  513. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  514. dt=getDt(M1.pid, Sin.sin_addr);
  515. c=*NET_BUF+1;
  516. write(s,(void*)&c,1);
  517. write(s,(void*)&dt,sizeof(dt));
  518. c=NET_EOM;
  519. write(s,(void*)&c,1);
  520. break;
  521. case NET_EXE :
  522. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  523. sN = (char *)(NET_BUF+sizeof(k)+1);
  524. sF = sN+strlen(sN)+1;
  525. if (strlen(sN)>=LLIB) sN[LLIB-1]='\0';
  526. i=getCliId(sN);
  527. if (i>=0) {
  528. send1car(s, NET_EXE+1);
  529. /* send the call */
  530. if (!connSock2(i)) {
  531. sendC(NET_EXE);
  532. sendBuf(Sock,(void*)&k, sizeof(k));
  533. sendBuf(Sock,(void*)sF, strlen(sF)+1);
  534. sendC(NET_EOM);
  535. }
  536. }
  537. else send1car(s, NET_ERR);
  538. break;
  539. case NET_PAR :
  540. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  541. sN = (char *)(NET_BUF+sizeof(k)+1);
  542. if (strlen(sN)>=LLIB) sN[LLIB-1]='\0';
  543. i=getCliId(sN);
  544. if (i>=0) {
  545. /* connect to client */
  546. if (!connSock2(i)) {
  547. send1car(s, NET_FIL); /* tell ok to sender */
  548. sendC(NET_PAR);
  549. sendBuf(Sock,(void*)&k, sizeof(k));
  550. sendC(NET_EOM);
  551. while ((i=read(s,NET_BUF,LNBUF)) > 0) {
  552. sendBuf(Sock, NET_BUF, i);
  553. if (NET_BUF[i-1] == NET_EOM) break;
  554. }
  555. send1car(s, NET_PAR+1);
  556. }
  557. else send1car(s, NET_ERR);
  558. }
  559. else send1car(s, NET_ERR);
  560. break;
  561. case NET_STS :
  562. STS=1;
  563. send1car(s, NET_STS+1);
  564. break;
  565. case NET_DRS :
  566. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  567. IF_netDrop(k);
  568. break;
  569. case NET_LI :
  570. c=*NET_BUF+1;
  571. write(s,(void*)&c,1);
  572. dup2(s,1);
  573. listCli();
  574. close(1);
  575. c=NET_EOM;
  576. write(s,(void*)&c,1);
  577. break;
  578. case NET_SLI :
  579. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  580. c=*NET_BUF+1;
  581. write(s,(void*)&c,1);
  582. dup2(s,1);
  583. IF_show_netStack(k);
  584. close(1);
  585. c=NET_EOM;
  586. write(s,(void*)&c,1);
  587. break;
  588. case NET_RUS :
  589. c=*NET_BUF+1;
  590. write(s,(void*)&c,1);
  591. dup2(s,1);
  592. IF_resUsage();
  593. close(1);
  594. c=NET_EOM;
  595. write(s,(void*)&c,1);
  596. break;
  597. case NET_U2S :
  598. while (1) {
  599. read(s,(void*)&c,1);
  600. if (c == NET_EOM) break;
  601. if (c != NET_DAT) {
  602. D_Trace("Erreur NET_DAT !"); break;
  603. }
  604. read(s,(void*)&n,sizeof(n));
  605. /* NTraceData(c, n);*/
  606. /* add the addresse */
  607. if ((M = malloc((size_t)n+lAdrNum())) != NULL) {
  608. rcvBuf(s,M,(sizeof(uint32_t)*2));
  609. rcvBuf(s,M+((sizeof(uint32_t)*2)+lAdrNum()),
  610. n-(sizeof(uint32_t)*2));
  611. putVar(M);
  612. }
  613. }
  614. break;
  615. case NET_S2U :
  616. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  617. /* NTraceData(NET_S2U, k);*/
  618. NetToStack(s,k);
  619. c=NET_EOM;
  620. write(s,(void*)&c,1);
  621. break;
  622. default :
  623. break;
  624. }
  625. }
  626. static int connSock(void)
  627. {
  628. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  629. messErr(31);
  630. return 1;
  631. }
  632. bcopy(&SinSav,&Sin,sizeof(Sin));
  633. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  634. messErr(34);
  635. return 1;
  636. }
  637. return 0; /* OK */
  638. }
  639. void main_Nrpc(void) /* main function for Nrpc client */
  640. {
  641. int sock, nsock;
  642. socklen_t ln;
  643. struct sockaddr_in Nsin;
  644. signal(SIGTERM, SIG_DFL);
  645. if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  646. stopServ(0, "socket",1);
  647. bzero(&Nsin,sizeof(Nsin));
  648. Nsin.sin_family = AF_INET;
  649. if (bind(sock, (struct sockaddr *)&Nsin, sizeof(Nsin)) < 0)
  650. stopServ(0, "bind",2);
  651. /* send Nrpc port */
  652. ln = sizeof(Nsin);
  653. if (getsockname(sock, (struct sockaddr *)&Nsin, &ln) < 0)
  654. stopServ(0, "gsname",3);
  655. if (connSock()) return;
  656. sendNrpcPort(Nsin.sin_port);
  657. if (readMess(Sock) != 2) { messErr(35); return; }
  658. close(Sock);
  659. if (*NET_BUF != (NET_NRP+1)) { messErr(40); return; }
  660. /* listen and wait demands */
  661. if (listen(sock,5) < 0) stopServ(0, "listen",4);
  662. ln = sizeof(Nsin);
  663. for (;;) {
  664. if((nsock=accept(sock,(struct sockaddr *)&Nsin,(socklen_t*)&ln)) < 0)
  665. stopServ(0, "accept",5);
  666. net_servrpc(nsock);
  667. close(nsock);
  668. }
  669. }
  670. int Nrpc_pid=-1;
  671. static void startNrpc(void)
  672. {
  673. if ((Nrpc_pid = fork()) == -1) stopErr("startNrpc","fork");
  674. if (Nrpc_pid == 0) { /* fils */
  675. close(0);
  676. close(1);
  677. /* close(2); */
  678. D_Reset();
  679. IF_stack_clear(); /* clear all stacks */
  680. IF_stackL_clear();
  681. IF_stackC_clear();
  682. main_Nrpc();
  683. exit(1);
  684. }
  685. }
  686. void main_Serv(void) /* main function of Server */
  687. {
  688. int ln, sock, nsock;
  689. initCli();
  690. if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  691. stopServ(1, "socket",1);
  692. bzero(&Sin.sin_addr,sizeof(Sin.sin_addr));
  693. if (bind(sock, (struct sockaddr *)&Sin, sizeof(Sin)) < 0)
  694. stopServ(1, "bind",2);
  695. if (listen(sock,5) < 0) stopServ(1, "listen",3);
  696. ln = sizeof(Sin);
  697. for (;;) {
  698. if((nsock=accept(sock,(struct sockaddr *)&Sin,(socklen_t*)&ln)) < 0)
  699. stopServ(1, "accept",4);
  700. net_service(nsock);
  701. close(nsock);
  702. }
  703. }
  704. static void startServer(void)
  705. {
  706. int pid;
  707. if ((pid = fork()) == -1) stopErr("startServer","fork");
  708. if (pid == 0) { /* fils */
  709. setsid();
  710. close(0);
  711. close(1);
  712. /* close(2); */
  713. D_Reset();
  714. close(Sock);
  715. IF_stack_clear(); /* clear all stacks */
  716. IF_stackL_clear();
  717. IF_stackC_clear();
  718. main_Serv();
  719. }
  720. sleep(2); /* wait for server initialization */
  721. }
  722. static void IF_netGetVal (char Code)
  723. {
  724. long long v;
  725. if (NET) {
  726. if (connSock()) return;
  727. sendGetStd(Code);
  728. if (readMess(Sock) != 2+sizeof(v)) { messErr(35); return; }
  729. close(Sock);
  730. if (*NET_BUF != (Code+1)) { messErr(40); return; }
  731. bcopy((void*)(NET_BUF+1),(void*)&v,sizeof(v));
  732. putLong(v);
  733. } else messErr(32);
  734. }
  735. void IF_netDt (void)
  736. {
  737. IF_netGetVal(NET_GDT);
  738. }
  739. void IF_netDepth (void)
  740. {
  741. IF_netGetVal(NET_DPH);
  742. }
  743. void IF_netOff (void)
  744. {
  745. if (NET) {
  746. if (connSock()) return;
  747. sendGetStd(NET_OFF);
  748. if (readMess(Sock) != 2) { messErr(35); return; }
  749. close(Sock);
  750. if (*NET_BUF != (NET_OFF+1)) { messErr(40); return; }
  751. if (Nrpc_pid > -1) { /* stop Nrpc local server */
  752. kill(Nrpc_pid, SIGTERM);
  753. Nrpc_pid=-1;
  754. }
  755. NET=0;
  756. }
  757. }
  758. void IF_netOn (void)
  759. {
  760. struct hostent *h;
  761. if (!isNString(1)) {
  762. messErr(6); return;
  763. }
  764. if (NET) {
  765. IF_dropC(); return;
  766. }
  767. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != -1) {
  768. if(!(h=gethostbyname(NetServer))) {
  769. messErr(33);
  770. return;
  771. }
  772. bzero(&Sin,sizeof(Sin));
  773. Sin.sin_family = AF_INET;
  774. bcopy(h->h_addr,&Sin.sin_addr,h->h_length);
  775. Sin.sin_port = htons(SERV_PORT);
  776. bcopy(&Sin,&SinSav,sizeof(Sin));
  777. if (strcmp(NetServer,LOCALS) == 0) /* localhost */
  778. SameSaS=1; /* same system as server */
  779. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  780. if (strcmp(NetServer,LOCALS) != 0) { /* not localhost */
  781. messErr(34);
  782. return;
  783. }
  784. /* Server is absent : fork it ! */
  785. startServer();
  786. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  787. messErr(34);
  788. return;
  789. }
  790. }
  791. sendInsc();
  792. if (readMess(Sock) != 2) { messErr(35); return; }
  793. close(Sock);
  794. if (*NET_BUF == (NET_OFF)) { messErr(38); return; }
  795. if (*NET_BUF != (NET_ON+1)) { messErr(40); return; }
  796. NET=1; /* net on !! */
  797. /* start RPC local server */
  798. startNrpc();
  799. } else messErr(31);
  800. }
  801. void IF_netExec (void)
  802. {
  803. char *sN, *sF;
  804. if (!isNString(2)) {
  805. messErr(6); return;
  806. }
  807. sN=getString();
  808. sF=getString();
  809. if (NET) {
  810. if (!connSock()) {
  811. sendC(NET_EXE);
  812. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  813. sendBuf(Sock,(void*)sN, strlen(sN)+1);
  814. sendBuf(Sock,(void*)sF, strlen(sF)+1);
  815. sendC(NET_EOM);
  816. if (readMess(Sock) != 2) messErr(35);
  817. close(Sock);
  818. if (*NET_BUF != (NET_EXE+1)) {
  819. if (*NET_BUF == (NET_ERR)) messErr(41);
  820. else messErr(40);
  821. }
  822. }
  823. }
  824. free((void*)sN);
  825. free((void*)sF);
  826. }
  827. void IF_netCompile (void)
  828. {
  829. char *sN, *sF;
  830. int fid;
  831. if (!isNString(2)) {
  832. messErr(6); return;
  833. }
  834. sN=getString();
  835. sF=getString();
  836. if ((fid=open(sF,O_RDONLY)) == -1) messErr(43);
  837. else
  838. if (NET) {
  839. if (!connSock()) {
  840. sendC(NET_PAR);
  841. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  842. sendBuf(Sock,(void*)sN, strlen(sN)+1);
  843. sendC(NET_EOM);
  844. /* wait for invitation */
  845. if (readMess(Sock) != 2) messErr(35);
  846. else {
  847. if (*NET_BUF == (NET_FIL)) {
  848. sendFile(Sock, fid);
  849. sendC(NET_EOM);
  850. if (readMess(Sock) != 2) messErr(35);
  851. }
  852. }
  853. close(Sock);
  854. if (*NET_BUF != (NET_PAR+1)) {
  855. if (*NET_BUF == (NET_ERR)) messErr(41);
  856. else messErr(40);
  857. }
  858. }
  859. }
  860. free((void*)sN);
  861. free((void*)sF);
  862. }
  863. void IF_netList (void)
  864. {
  865. if (NET) {
  866. if (connSock()) return;
  867. send1car(Sock,NET_LI);
  868. readAff(Sock, NET_LI+1);
  869. close(Sock);
  870. }
  871. printf("<end of net list>\n");
  872. }
  873. void IF_netStackList (void)
  874. {
  875. if (NET) {
  876. if (connSock()) return;
  877. sendC(NET_SLI);
  878. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  879. sendC(NET_EOM);
  880. readAff(Sock, NET_SLI+1);
  881. close(Sock);
  882. }
  883. /* printf("<end of net stack>\n"); */
  884. }
  885. void IF_netDropS (void)
  886. {
  887. if (NET) {
  888. if (NetKey == UNI_KEY) {
  889. messErr(37);
  890. return;
  891. }
  892. if (connSock()) return;
  893. sendC(NET_DRS);
  894. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  895. sendC(NET_EOM);
  896. close(Sock);
  897. }
  898. }
  899. void IF_netRusage (void)
  900. {
  901. if (NET) {
  902. if (connSock()) return;
  903. send1car(Sock,NET_RUS);
  904. readAff(Sock, NET_RUS+1);
  905. close(Sock);
  906. }
  907. printf("<end of server ressources usage>\n");
  908. }
  909. void IF_netStopS (void)
  910. {
  911. if (NET) {
  912. if (connSock()) return;
  913. send1car(Sock,NET_STS);
  914. if (readMess(Sock) != 2) { messErr(35); return; }
  915. close(Sock);
  916. if (*NET_BUF != (NET_STS+1)) { messErr(40); return; }
  917. }
  918. }
  919. void IF_netU2S(void)
  920. {
  921. long n;
  922. if (NET) {
  923. if (!getParLong(&n)) return;
  924. if (n==0) return;
  925. if (NetKey == UNI_KEY) {
  926. messErr(37);
  927. return;
  928. }
  929. if (connSock()) return;
  930. send1car(Sock,NET_U2S);
  931. StackToNet(n);
  932. sendC(NET_EOM);
  933. close(Sock);
  934. } else messErr(32);
  935. }
  936. void IF_netS2U(void)
  937. {
  938. uint32_t n;
  939. void *M;
  940. char c;
  941. if (NET) {
  942. if (connSock()) return;
  943. sendC(NET_S2U);
  944. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  945. sendC(NET_EOM);
  946. while (1) {
  947. read(Sock,(void*)&c,1);
  948. if (c == NET_EOM) break;
  949. if (c != NET_DAT) {
  950. messErr(40); break;
  951. }
  952. read(Sock,(void*)&n,sizeof(n));
  953. /* add the addresse */
  954. if ((M = malloc((size_t)n+lAdrNum())) != NULL) {
  955. rcvBuf(Sock,M,(sizeof(uint32_t)*2));
  956. rcvBuf(Sock,M+((sizeof(uint32_t)*2)+lAdrNum()),
  957. n-(sizeof(uint32_t)*2));
  958. putVar(M);
  959. } else stopErr("IF_netS2U","malloc");
  960. }
  961. close(Sock);
  962. } else messErr(32);
  963. }