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.
 
 
 
 

1074 lines
24 KiB

  1. /* Copyright (C) 2011-2022 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. if (b == f) break;
  236. b++;
  237. }
  238. if (*b != NET_EOM) return -1;
  239. b++;
  240. return(b-NET_BUF);
  241. }
  242. static int readMess2(int s, int n)
  243. {
  244. char * b, *f;
  245. b = NET_BUF;
  246. f = b + n;
  247. while (1) {
  248. if (read(s,(void*)b,1) <= 0) break;
  249. b++;
  250. if (b == f) break;
  251. }
  252. if (*b != NET_EOM) return -1;
  253. return(n);
  254. }
  255. static void readAff(int s, char C)
  256. {
  257. char b[2];
  258. int ok=0;
  259. if (read(s,(void*)b,1) <= 0) return;
  260. if (*b == C) ok=1;
  261. while (*b != NET_EOM) {
  262. if (read(s,(void*)b,1) <= 0) break;
  263. else {
  264. if (ok) write(1,(void*)b,1);
  265. }
  266. }
  267. }
  268. static void sendC(char c)
  269. {
  270. write(Sock,(void*)&c,1);
  271. }
  272. static void sendBuf(int s, void * b, size_t no)
  273. {
  274. write(s,b,no);
  275. }
  276. static void rcvBuf(int s, void * b, uint32_t no)
  277. {
  278. int r,ar;
  279. void *t;
  280. ar = no;
  281. r = 0;
  282. t = b;
  283. while ((r=read(s,t,ar)) != ar) {
  284. if (r<0) break;
  285. ar -= r;
  286. t += r;
  287. }
  288. }
  289. void sendData(int s, void * b, uint32_t n)
  290. {
  291. char c;
  292. c=NET_DAT;
  293. write(s,(void*)&c,1);
  294. n -= lAdrNum(); /* don't send the addresse */
  295. sendBuf(s,&n,sizeof(n));
  296. /* sendBuf(s,b,(size_t)n); */
  297. sendBuf(s,b,sizeof(uint32_t)*2);
  298. b+=(sizeof(uint32_t)*2)+lAdrNum();
  299. n-=(sizeof(uint32_t)*2);
  300. sendBuf(s,b,(size_t)n);
  301. }
  302. void sendDataC(void *b, uint32_t n)
  303. {
  304. sendData(Sock,b,n);
  305. }
  306. void sendFile(int s, int fid)
  307. {
  308. int n;
  309. char Buf[LNBUF];
  310. while ((n = read(fid,(void*)Buf,LNBUF)) > 0)
  311. sendBuf(s,(void*)Buf,(size_t)n);
  312. close(fid);
  313. }
  314. static void sendInsc(void)
  315. {
  316. char *s;
  317. struct Mess1 M1;
  318. uint32_t scs;
  319. struct timeval tv;
  320. long long v;
  321. scs = getScs();
  322. s = getString();
  323. M1.pid = getpid();
  324. strncpy(M1.lib,s,LLIB-1);
  325. M1.lib[LLIB-1]='\0';
  326. if (SameSaS) sendC(NET_ON);
  327. else sendC(NET_ONR);
  328. write(Sock,(void*)&scs,sizeof(scs));
  329. write(Sock,(void*)&M1,sizeof(M1));
  330. sendC(NET_EOM);
  331. /* update NetName */
  332. if (NetName != NULL) free((void*)NetName);
  333. NetName=s;
  334. if (SameSaS==0) {
  335. if (readMess(Sock) == 2) {
  336. if (*NET_BUF == (NET_CAL)) {
  337. gettimeofday(&tv,NULL);
  338. v=Nife_time(tv);
  339. sendC(NET_CAL+1);
  340. write(Sock,(void*)&v,sizeof(v));
  341. sendC(NET_EOM);
  342. }
  343. }
  344. } else SameSaS=0;
  345. }
  346. static void sendGetStd(char Code)
  347. {
  348. struct Mess1 M1;
  349. switch(Code) {
  350. case NET_OFF :
  351. case NET_GDT :
  352. M1.pid = getpid();
  353. break;
  354. default :
  355. M1.pid = NetKey;
  356. }
  357. strcpy(M1.lib,"-");
  358. sendC(Code);
  359. write(Sock,(void*)&M1,sizeof(M1));
  360. sendC(NET_EOM);
  361. }
  362. static void sendNrpcPort(in_port_t P)
  363. {
  364. struct Mess1 M1;
  365. M1.pid = getppid(); /* parent pid ! */
  366. M1.port = P;
  367. sendC(NET_NRP);
  368. write(Sock,(void*)&M1,sizeof(M1));
  369. sendC(NET_EOM);
  370. }
  371. static void send1car(int s, char c)
  372. {
  373. char b[2];
  374. b[0]=c;
  375. b[1]=NET_EOM;
  376. write(s,b,2);
  377. }
  378. void NTraceM1(char * A)
  379. {
  380. struct Mess1 M1;
  381. char buf[50];
  382. bcopy((void*)(A+1),(void*)&M1,sizeof(M1));
  383. sprintf(buf,"TraceM1 %c %d %s !",*A, M1.pid, M1.lib);
  384. D_Trace(buf);
  385. }
  386. void NTraceData(char A, long n)
  387. {
  388. char buf[50];
  389. sprintf(buf,"TraceData %c %ld !",A, n);
  390. D_Trace(buf);
  391. }
  392. static void RemotExecBegin(long long k)
  393. {
  394. putLong(k);
  395. IF_NetKey();
  396. IF_netS2U();
  397. IF_netDropS();
  398. }
  399. static void RemotExecEnd(void)
  400. {
  401. if (noErr()) {
  402. razErr();
  403. IF_stack_clear(); /* clear all stacks */
  404. IF_stackL_clear();
  405. IF_stackC_clear();
  406. IF_NetErrVal();
  407. }
  408. IF_depth();
  409. IF_netU2S();
  410. IF_stack_clear(); /* don't eat any bread ! */
  411. IF_stackL_clear();
  412. IF_stackC_clear();
  413. }
  414. static void net_servrpc(int s)
  415. {
  416. int i, j, fid;
  417. uint32_t k;
  418. char *sF, nF[30];
  419. i=readMess(s);
  420. NET_BUF[i]='\0';
  421. D_TraceH(NET_BUF,i); /* to debug */
  422. switch(*NET_BUF) {
  423. case NET_OFF :
  424. send1car(s, NET_OFF+1);
  425. D_Close();
  426. exit(0); /* stop the Nrpc client */
  427. break;
  428. case NET_EXE :
  429. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  430. sF = (char *)(NET_BUF+sizeof(k)+1);
  431. /* execute the function call */
  432. /* fprintf(stderr,"Nife_RPC : %s NetKey=%x !\n",sF,k);*/
  433. RemotExecBegin((long long)k);
  434. if (!execLibNrpc(sF)) IF_NetErrVal();
  435. RemotExecEnd();
  436. break;
  437. case NET_PAR :
  438. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  439. sprintf(nF,"w_%d.nif",getpid());
  440. if ((fid = open(nF,O_CREAT|O_TRUNC|O_RDWR,0600)) != -1) {
  441. j=1;
  442. while ((j==1) && ((i=read(s,NET_BUF,LNBUF)) > 0)) {
  443. if (NET_BUF[i-1] == NET_EOM){
  444. j=0; i--;
  445. }
  446. write(fid, NET_BUF, i);
  447. }
  448. close(fid);
  449. RemotExecBegin((long long)k);
  450. compileFile(nF);
  451. RemotExecEnd();
  452. unlink(nF);
  453. }
  454. break;
  455. default :
  456. break;
  457. }
  458. }
  459. static void net_service(int s)
  460. {
  461. int i, CalDT=0;
  462. uint32_t n, k,scs;
  463. void *M;
  464. struct Mess1 M1;
  465. struct timeval tv;
  466. long long v1, v2, vm, vr, dt;
  467. char c, *sN, *sF;
  468. i=readMess(s);
  469. NET_BUF[i]='\0';
  470. D_TraceH(NET_BUF,i); /* for debug */
  471. switch(*NET_BUF) {
  472. case NET_ONR :
  473. CalDT=1;
  474. case NET_ON :
  475. /* NTraceM1(NET_BUF); */
  476. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  477. scs = getScs();
  478. if (k==scs) {
  479. bcopy((void*)(NET_BUF+sizeof(k)+1),(void*)&M1,sizeof(M1));
  480. if (CalDT) {
  481. gettimeofday(&tv,NULL);
  482. send1car(s, NET_CAL);
  483. v1=Nife_time(tv);
  484. i=readMess(s);
  485. gettimeofday(&tv,NULL);
  486. v2=Nife_time(tv);
  487. if (*NET_BUF == NET_CAL+1) {
  488. bcopy((void*)(NET_BUF+1),(void*)&vr,sizeof(vr));
  489. vm = v1 + ((v2-v1)/2);
  490. addCli(M1.pid, Sin.sin_addr, M1.lib, (int)(vm-vr));
  491. }
  492. else
  493. addCli(M1.pid, Sin.sin_addr, M1.lib, -9);
  494. send1car(s, NET_ON+1);
  495. } else {
  496. addCli(M1.pid, Sin.sin_addr, M1.lib, 0);
  497. send1car(s, NET_ON+1);
  498. }
  499. }
  500. else
  501. send1car(s, NET_OFF);
  502. break;
  503. case NET_OFF :
  504. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  505. delCli(M1.pid, Sin.sin_addr);
  506. send1car(s, NET_OFF+1);
  507. if (STS) {
  508. if (NCli == 0) {
  509. D_Close();
  510. exit(0); /* stop the server */
  511. }
  512. STS=0;
  513. }
  514. break;
  515. case NET_NRP :
  516. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  517. majNRP(M1.pid, M1.port);
  518. send1car(s, NET_NRP+1);
  519. break;
  520. case NET_DPH :
  521. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  522. dt=NetDepth(M1.pid);
  523. c=*NET_BUF+1;
  524. write(s,(void*)&c,1);
  525. write(s,(void*)&dt,sizeof(dt));
  526. c=NET_EOM;
  527. write(s,(void*)&c,1);
  528. break;
  529. case NET_GDT :
  530. bcopy((void*)(NET_BUF+1),(void*)&M1,sizeof(M1));
  531. dt=getDt(M1.pid, Sin.sin_addr);
  532. c=*NET_BUF+1;
  533. write(s,(void*)&c,1);
  534. write(s,(void*)&dt,sizeof(dt));
  535. c=NET_EOM;
  536. write(s,(void*)&c,1);
  537. break;
  538. case NET_EXE :
  539. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  540. sN = (char *)(NET_BUF+sizeof(k)+1);
  541. sF = sN+strlen(sN)+1;
  542. if (strlen(sN)>=LLIB) sN[LLIB-1]='\0';
  543. i=getCliId(sN);
  544. if (i>=0) {
  545. send1car(s, NET_EXE+1);
  546. /* send the call */
  547. if (!connSock2(i)) {
  548. sendC(NET_EXE);
  549. sendBuf(Sock,(void*)&k, sizeof(k));
  550. sendBuf(Sock,(void*)sF, strlen(sF)+1);
  551. sendC(NET_EOM);
  552. }
  553. }
  554. else send1car(s, NET_ERR);
  555. break;
  556. case NET_PAR :
  557. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  558. sN = (char *)(NET_BUF+sizeof(k)+1);
  559. if (strlen(sN)>=LLIB) sN[LLIB-1]='\0';
  560. i=getCliId(sN);
  561. if (i>=0) {
  562. /* connect to client */
  563. if (!connSock2(i)) {
  564. send1car(s, NET_FIL); /* tell ok to sender */
  565. sendC(NET_PAR);
  566. sendBuf(Sock,(void*)&k, sizeof(k));
  567. sendC(NET_EOM);
  568. while ((i=read(s,NET_BUF,LNBUF)) > 0) {
  569. sendBuf(Sock, NET_BUF, i);
  570. if (NET_BUF[i-1] == NET_EOM) break;
  571. }
  572. send1car(s, NET_PAR+1);
  573. }
  574. else send1car(s, NET_ERR);
  575. }
  576. else send1car(s, NET_ERR);
  577. break;
  578. case NET_STS :
  579. STS=1;
  580. send1car(s, NET_STS+1);
  581. break;
  582. case NET_DRS :
  583. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  584. IF_netDrop(k);
  585. break;
  586. case NET_LI :
  587. c=*NET_BUF+1;
  588. write(s,(void*)&c,1);
  589. dup2(s,1);
  590. listCli();
  591. close(1);
  592. c=NET_EOM;
  593. write(s,(void*)&c,1);
  594. break;
  595. case NET_SLI :
  596. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  597. c=*NET_BUF+1;
  598. write(s,(void*)&c,1);
  599. dup2(s,1);
  600. IF_show_netStack(k);
  601. close(1);
  602. c=NET_EOM;
  603. write(s,(void*)&c,1);
  604. break;
  605. case NET_RUS :
  606. c=*NET_BUF+1;
  607. write(s,(void*)&c,1);
  608. dup2(s,1);
  609. IF_resUsage();
  610. close(1);
  611. c=NET_EOM;
  612. write(s,(void*)&c,1);
  613. break;
  614. case NET_U2S :
  615. while (1) {
  616. read(s,(void*)&c,1);
  617. if (c == NET_EOM) break;
  618. if (c != NET_DAT) {
  619. D_Trace("Erreur NET_DAT !"); break;
  620. }
  621. read(s,(void*)&n,sizeof(n));
  622. /* NTraceData(c, n);*/
  623. /* add the addresse */
  624. if ((M = malloc((size_t)n+lAdrNum())) != NULL) {
  625. rcvBuf(s,M,(sizeof(uint32_t)*2));
  626. rcvBuf(s,M+((sizeof(uint32_t)*2)+lAdrNum()),
  627. n-(sizeof(uint32_t)*2));
  628. putVar(M);
  629. }
  630. }
  631. break;
  632. case NET_S2U :
  633. bcopy((void*)(NET_BUF+1),(void*)&k,sizeof(k));
  634. /* NTraceData(NET_S2U, k);*/
  635. NetToStack(s,k);
  636. c=NET_EOM;
  637. write(s,(void*)&c,1);
  638. break;
  639. default :
  640. break;
  641. }
  642. }
  643. static int connSock(void)
  644. {
  645. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
  646. messErr(31);
  647. return 1;
  648. }
  649. bcopy(&SinSav,&Sin,sizeof(Sin));
  650. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  651. messErr(34);
  652. return 1;
  653. }
  654. return 0; /* OK */
  655. }
  656. static void InterruptRpc(int S)
  657. {
  658. D_Close();
  659. exit(0);
  660. }
  661. void main_Nrpc(void) /* main function for Nrpc client */
  662. {
  663. int sock, nsock;
  664. socklen_t ln;
  665. struct sockaddr_in Nsin;
  666. signal(SIGTERM, InterruptRpc);
  667. if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  668. stopServ(0, "socket",1);
  669. bzero(&Nsin,sizeof(Nsin));
  670. Nsin.sin_family = AF_INET;
  671. if (bind(sock, (struct sockaddr *)&Nsin, sizeof(Nsin)) < 0)
  672. stopServ(0, "bind",2);
  673. /* send Nrpc port */
  674. ln = sizeof(Nsin);
  675. if (getsockname(sock, (struct sockaddr *)&Nsin, &ln) < 0)
  676. stopServ(0, "gsname",3);
  677. if (connSock()) return;
  678. sendNrpcPort(Nsin.sin_port);
  679. if (readMess(Sock) != 2) { messErr(35); return; }
  680. close(Sock);
  681. if (*NET_BUF != (NET_NRP+1)) { messErr(40); return; }
  682. /* listen and wait demands */
  683. if (listen(sock,5) < 0) stopServ(0, "listen",4);
  684. ln = sizeof(Nsin);
  685. for (;;) {
  686. if((nsock=accept(sock,(struct sockaddr *)&Nsin,(socklen_t*)&ln)) < 0)
  687. stopServ(0, "accept",5);
  688. net_servrpc(nsock);
  689. close(nsock);
  690. }
  691. }
  692. int Nrpc_pid=-1;
  693. static void startNrpc(void)
  694. {
  695. if ((Nrpc_pid = fork()) == -1) stopErr("startNrpc","fork");
  696. if (Nrpc_pid == 0) { /* fils */
  697. close(0);
  698. close(1);
  699. /* close(2); */
  700. if (Debug) Debug=3;
  701. D_Reset();
  702. IF_stack_clear(); /* clear all stacks */
  703. IF_stackL_clear();
  704. IF_stackC_clear();
  705. main_Nrpc();
  706. exit(1);
  707. }
  708. }
  709. void main_Serv(void) /* main function of Server */
  710. {
  711. int ln, sock, nsock;
  712. initCli();
  713. if ((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
  714. stopServ(1, "socket",1);
  715. bzero(&Sin.sin_addr,sizeof(Sin.sin_addr));
  716. if (bind(sock, (struct sockaddr *)&Sin, sizeof(Sin)) < 0)
  717. stopServ(1, "bind",2);
  718. if (listen(sock,5) < 0) stopServ(1, "listen",3);
  719. ln = sizeof(Sin);
  720. for (;;) {
  721. if((nsock=accept(sock,(struct sockaddr *)&Sin,(socklen_t*)&ln)) < 0)
  722. stopServ(1, "accept",4);
  723. net_service(nsock);
  724. close(nsock);
  725. }
  726. }
  727. static void startServer(void)
  728. {
  729. int pid;
  730. if ((pid = fork()) == -1) stopErr("startServer","fork");
  731. if (pid == 0) { /* fils */
  732. setsid();
  733. close(0);
  734. close(1);
  735. /* close(2); */
  736. if (Debug) Debug=2;
  737. D_Reset();
  738. close(Sock);
  739. IF_stack_clear(); /* clear all stacks */
  740. IF_stackL_clear();
  741. IF_stackC_clear();
  742. main_Serv();
  743. }
  744. sleep(2); /* wait for server initialization */
  745. }
  746. static void IF_netGetVal (char Code)
  747. {
  748. long long v;
  749. if (NET) {
  750. if (connSock()) return;
  751. sendGetStd(Code);
  752. if (readMess2(Sock,(2+sizeof(v))) != 2+sizeof(v)) { messErr(35); return; }
  753. close(Sock);
  754. if (*NET_BUF != (Code+1)) { messErr(40); return; }
  755. bcopy((void*)(NET_BUF+1),(void*)&v,sizeof(v));
  756. putLong(v);
  757. } else messErr(32);
  758. }
  759. void IF_netDt (void)
  760. {
  761. IF_netGetVal(NET_GDT);
  762. }
  763. void IF_netDepth (void)
  764. {
  765. IF_netGetVal(NET_DPH);
  766. }
  767. void IF_netOff (void)
  768. {
  769. if (NET) {
  770. if (connSock()) return;
  771. sendGetStd(NET_OFF);
  772. if (readMess(Sock) != 2) { messErr(35); return; }
  773. close(Sock);
  774. if (*NET_BUF != (NET_OFF+1)) { messErr(40); return; }
  775. if (Nrpc_pid > -1) { /* stop Nrpc local server */
  776. kill(Nrpc_pid, SIGTERM);
  777. Nrpc_pid=-1;
  778. }
  779. NET=0;
  780. }
  781. }
  782. void IF_netOn (void)
  783. {
  784. struct hostent *h;
  785. if (!isNString(1)) {
  786. messErr(6); return;
  787. }
  788. if (NET) {
  789. IF_dropC(); return;
  790. }
  791. if ((Sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != -1) {
  792. if(!(h=gethostbyname(NetServer))) {
  793. messErr(33);
  794. return;
  795. }
  796. bzero(&Sin,sizeof(Sin));
  797. Sin.sin_family = AF_INET;
  798. bcopy(h->h_addr,&Sin.sin_addr,h->h_length);
  799. Sin.sin_port = htons(SERV_PORT);
  800. bcopy(&Sin,&SinSav,sizeof(Sin));
  801. if (strcmp(NetServer,LOCALS) == 0) /* localhost */
  802. SameSaS=1; /* same system as server */
  803. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  804. if (strcmp(NetServer,LOCALS) != 0) { /* not localhost */
  805. messErr(34);
  806. return;
  807. }
  808. /* Server is absent : fork it ! */
  809. startServer();
  810. if(connect(Sock,(struct sockaddr *)&Sin,sizeof(Sin)) < 0) {
  811. messErr(34);
  812. return;
  813. }
  814. }
  815. sendInsc();
  816. if (readMess(Sock) != 2) { messErr(35); return; }
  817. close(Sock);
  818. if (*NET_BUF == (NET_OFF)) { messErr(38); return; }
  819. if (*NET_BUF != (NET_ON+1)) { messErr(40); return; }
  820. NET=1; /* net on !! */
  821. /* start RPC local server */
  822. startNrpc();
  823. } else messErr(31);
  824. }
  825. void IF_netExec (void)
  826. {
  827. char *sN, *sF;
  828. if (!isNString(2)) {
  829. messErr(6); return;
  830. }
  831. sN=getString();
  832. sF=getString();
  833. if (NET) {
  834. if (!connSock()) {
  835. sendC(NET_EXE);
  836. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  837. sendBuf(Sock,(void*)sN, strlen(sN)+1);
  838. sendBuf(Sock,(void*)sF, strlen(sF)+1);
  839. sendC(NET_EOM);
  840. if (readMess(Sock) != 2) messErr(35);
  841. close(Sock);
  842. if (*NET_BUF != (NET_EXE+1)) {
  843. if (*NET_BUF == (NET_ERR)) messErr(41);
  844. else messErr(40);
  845. }
  846. }
  847. }
  848. free((void*)sN);
  849. free((void*)sF);
  850. }
  851. void IF_netCompile (void)
  852. {
  853. char *sN, *sF;
  854. int fid;
  855. if (!isNString(2)) {
  856. messErr(6); return;
  857. }
  858. sN=getString();
  859. sF=getString();
  860. if ((fid=open(sF,O_RDONLY)) == -1) messErr(43);
  861. else
  862. if (NET) {
  863. if (!connSock()) {
  864. sendC(NET_PAR);
  865. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  866. sendBuf(Sock,(void*)sN, strlen(sN)+1);
  867. sendC(NET_EOM);
  868. /* wait for invitation */
  869. if (readMess(Sock) != 2) messErr(35);
  870. else {
  871. if (*NET_BUF == (NET_FIL)) {
  872. sendFile(Sock, fid);
  873. sendC(NET_EOM);
  874. if (readMess(Sock) != 2) messErr(35);
  875. }
  876. }
  877. close(Sock);
  878. if (*NET_BUF != (NET_PAR+1)) {
  879. if (*NET_BUF == (NET_ERR)) messErr(41);
  880. else messErr(40);
  881. }
  882. }
  883. }
  884. free((void*)sN);
  885. free((void*)sF);
  886. }
  887. void IF_netList (void)
  888. {
  889. if (NET) {
  890. if (connSock()) return;
  891. send1car(Sock,NET_LI);
  892. readAff(Sock, NET_LI+1);
  893. close(Sock);
  894. }
  895. printf("<end of net list>\n");
  896. }
  897. void IFD_netList (void)
  898. {
  899. _IFD_BEGIN_
  900. IF_netList();
  901. _IFD_END_
  902. }
  903. void IF_netStackList (void)
  904. {
  905. if (NET) {
  906. if (connSock()) return;
  907. sendC(NET_SLI);
  908. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  909. sendC(NET_EOM);
  910. readAff(Sock, NET_SLI+1);
  911. close(Sock);
  912. }
  913. }
  914. void IFD_netStackList (void)
  915. {
  916. _IFD_BEGIN_
  917. IF_netStackList();
  918. _IFD_END_
  919. }
  920. void IF_netDropS (void)
  921. {
  922. if (NET) {
  923. if (NetKey == UNI_KEY) {
  924. messErr(37);
  925. return;
  926. }
  927. if (connSock()) return;
  928. sendC(NET_DRS);
  929. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  930. sendC(NET_EOM);
  931. close(Sock);
  932. }
  933. }
  934. void IF_netRusage (void)
  935. {
  936. if (NET) {
  937. if (connSock()) return;
  938. send1car(Sock,NET_RUS);
  939. readAff(Sock, NET_RUS+1);
  940. close(Sock);
  941. }
  942. printf("<end of server ressources usage>\n");
  943. }
  944. void IF_netStopS (void)
  945. {
  946. if (NET) {
  947. if (connSock()) return;
  948. send1car(Sock,NET_STS);
  949. if (readMess(Sock) != 2) { messErr(35); return; }
  950. close(Sock);
  951. if (*NET_BUF != (NET_STS+1)) { messErr(40); return; }
  952. }
  953. }
  954. void IF_netU2S(void)
  955. {
  956. long n;
  957. if (NET) {
  958. if (!getParLong(&n)) return;
  959. if (n==0) return;
  960. if (NetKey == UNI_KEY) {
  961. messErr(37);
  962. return;
  963. }
  964. if (connSock()) return;
  965. send1car(Sock,NET_U2S);
  966. StackToNet(n);
  967. sendC(NET_EOM);
  968. close(Sock);
  969. } else messErr(32);
  970. }
  971. void IF_netS2U(void)
  972. {
  973. uint32_t n;
  974. void *M;
  975. char c;
  976. if (NET) {
  977. if (connSock()) return;
  978. sendC(NET_S2U);
  979. sendBuf(Sock,_ADDV_NetKey_, sizeof(NetKey));
  980. sendC(NET_EOM);
  981. while (1) {
  982. read(Sock,(void*)&c,1);
  983. if (c == NET_EOM) break;
  984. if (c != NET_DAT) {
  985. messErr(40); break;
  986. }
  987. read(Sock,(void*)&n,sizeof(n));
  988. /* add the addresse */
  989. if ((M = malloc((size_t)n+lAdrNum())) != NULL) {
  990. rcvBuf(Sock,M,(sizeof(uint32_t)*2));
  991. rcvBuf(Sock,M+((sizeof(uint32_t)*2)+lAdrNum()),
  992. n-(sizeof(uint32_t)*2));
  993. putVar(M);
  994. } else stopErr("IF_netS2U","malloc");
  995. }
  996. close(Sock);
  997. } else messErr(32);
  998. }