main.cpp
上传用户:hnnddl
上传日期:2007-01-06
资源大小:3580k
文件大小:21k
源码类别:

IP电话/视频会议

开发平台:

WINDOWS

  1. /*
  2.  * $Revision: 1.23 $
  3.  * $Date: 1999/03/15 22:49:37 $
  4.  */
  5. ////////////////////////////////////////////////////////////////
  6. //               Copyright (c) 1996-98 Lucent Technologies    //
  7. //                       All Rights Reserved                  //
  8. //                                                            //
  9. //                       THIS IS UNPUBLISHED                  //
  10. //                       PROPRIETARY SOURCE                   //
  11. //                   CODE OF Lucent Technologies              //
  12. // AND elemedia   //
  13. //                                                            //
  14. ////////////////////////////////////////////////////////////////
  15. //
  16. ////////////////////////////////////////////////////////////////
  17. // Example programs are provided soley to demonstrate one     //
  18. // possible use of the stack libraries and are included for   //
  19. // instructional purposes only.  You are free to use, modify  //
  20. // and/or redistribute any portion of code in the example     //
  21. // programs.  However, such examples are not intended to      //
  22. // represent production quality code.                         //
  23. //                                                            //
  24. // THE COPYRIGHT HOLDERS PROVIDE THESE EXAMPLE PROGRAMS       //
  25. // "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED     //
  26. // OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     //
  27. // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A            //
  28. // PARTICULAR PURPOSE.                                        //
  29. ////////////////////////////////////////////////////////////////
  30. #include "exchange.h"
  31. #include "call.h"
  32. #include "msg.h"
  33. #include "h450msgs.h"
  34. #include "api/apicommon.h"
  35. #if defined(VXWORKS)
  36. #include <memLib.h>
  37. #include <private/memPartLibP.h>
  38. #endif
  39. #if !defined(VXWORKS) && !defined(WIN32)
  40. #include <sys/resource.h>
  41. #endif
  42. #if (defined(__sun))
  43. #define INADDR_NONE 0xffffffff
  44. #endif
  45. #if (defined(ENABLE_BENCHMARKS))
  46. #include "perf.h"
  47. #endif
  48. #if !defined(VXWORKS)
  49. int parse_command_line (int argc, char * argv []);
  50. void show_usage (const char * progname);
  51. #endif
  52. config_data *config;
  53. #if defined(VXWORKS)
  54. ms()
  55. #else
  56. //main()
  57. main( int argc, char *argv[])
  58. #endif
  59.  {
  60. Exchange* ex;
  61. ProtReturnCode result;
  62. config = new config_data;
  63. #if !defined(VXWORKS)
  64. if (argc > 1)
  65. {
  66. int need_usage = 0;
  67. if (parse_command_line(argc, argv))
  68. {
  69. show_usage(argv[0]);
  70. delete config;
  71. return(1);
  72. }
  73. }
  74. #endif
  75. #if !defined(VXWORKS) && !defined(WIN32)
  76. struct rlimit r;
  77. if (getrlimit(RLIMIT_NOFILE,&r) == 0)
  78. {
  79. printf("Current NOFILE limit, Soft = %d, Hard = %dn",
  80. r.rlim_cur, r.rlim_max);
  81. r.rlim_cur = RLIM_INFINITY;
  82. r.rlim_max = RLIM_INFINITY;
  83. if ((setrlimit(RLIMIT_NOFILE,&r) == 0) && 
  84. (setrlimit(RLIMIT_DATA,&r) == 0) &&
  85. #if defined(__hpux)
  86. (setrlimit(RLIMIT_AS,&r) == 0))
  87. #else
  88. (setrlimit(RLIMIT_VMEM,&r) == 0))
  89. #endif
  90. {
  91. printf("All resource limits set to INFINITYn");
  92. }
  93. else
  94. {
  95. printf("setrlimit failed, errno = %dn",errno);
  96. }
  97. }
  98. else
  99. {
  100. printf("getrlimit failed, errno = %dn",errno);
  101. }
  102. #endif
  103. InitializeProtocolStack();
  104. #if defined(USE_RAS)
  105. H225CSEndpointType et;
  106.     H225CSVendorID vend;
  107.     char *greeting = "elemedia multi-line terminal";
  108. vend.SetH221NonStd(0xde, 0, 0xad);
  109. vend.SetProductID((unsigned char *)greeting, strlen(greeting) + 1);
  110. vend.SetVersionID((unsigned char *)greeting, strlen(greeting) + 1);
  111. et.SetVendor(vend);
  112. et.SetTerminal(NULL);
  113. et.SetMC(FALSE);
  114. et.SetUndefinedNode (FALSE);
  115. ex = new Exchange(et,vend,CLT_TERMINAL,result);
  116. #else
  117. ex = new Exchange(result);
  118. #endif
  119. // print the protocol versions...
  120. printf("%sn", H225CSGetVersionString());
  121. printf("%sn", H245SigGetVersionString());
  122. ex->Start();
  123. #if defined(USE_RAS)
  124. if (config->discoverGK)
  125. ex->DiscoverGK();
  126. else
  127. ex->RegisterWithGK();
  128. #endif
  129. printf("Exchange created, press 'x' to exitn");
  130. ex->UserInterface();
  131. #if defined(USE_RAS)
  132. // ex->UnRegisterWithGK();
  133. #endif
  134. ex->Stop();
  135. delete ex;
  136. delete config;
  137. UninitializeProtocolStack();
  138. return(0);
  139. }
  140. #if (defined(unix))
  141. void 
  142. mydelay(int secs)
  143. {
  144. timestruc_t to;
  145. mutex_t  mtx;
  146. cond_t cv;
  147. if (secs == 0)
  148. {
  149. return;
  150. }
  151. cond_init(&cv, USYNC_THREAD, NULL);
  152. mutex_init(&mtx,USYNC_THREAD, NULL);
  153. mutex_lock(&mtx);
  154. to.tv_sec = time(NULL) + secs;
  155. to.tv_nsec = 0;
  156. cond_timedwait(&cv, &mtx, &to); 
  157. mutex_destroy(&mtx);
  158. cond_destroy(&cv);
  159. }
  160. #elif (defined(WIN32))
  161. void
  162. mydelay(int secs)
  163. {
  164. HANDLE evt;
  165. evt = CreateEvent(NULL, FALSE, FALSE, NULL);
  166. WaitForSingleObject(evt, secs*1000);
  167. CloseHandle(evt);
  168. }
  169. #elif defined(VXWORKS)
  170. void
  171. mydelay(int secs)
  172. {
  173. taskDelay(sysClkRateGet() * secs);
  174. }
  175. #elif (defined(__hpux))
  176. void 
  177. mydelay(int secs)
  178. {
  179.         struct pollfd fds[1];
  180.         fds[0].fd = -1;
  181.         if (poll(fds,1,secs*1000) != 0)
  182.                 LOG("poll() timeout by an unknown eventn");
  183. }
  184. #else
  185. void
  186. mydelay(int secs)
  187. {
  188. return;
  189. }
  190. #endif
  191. void
  192. Exchange::UserInterface()
  193. {
  194. while(1)
  195. {
  196. char command[512];
  197. char save[512];
  198. printf(">>");
  199. if (gets(command) == NULL)
  200. {
  201. printf("gets failed, error %dn",errno);
  202. }
  203. if (command[0] == 'n' || command[0] == '')
  204. {
  205. continue;
  206. }
  207. again:
  208. switch(command[0])
  209. {
  210. case 'c':
  211. case 'C':
  212. {
  213. char remote[256];
  214. sscanf(command+1,"%s",remote);
  215. unsigned int remote_address = HostNameToIP(remote);
  216. if (remote_address != INADDR_NONE)
  217. PlaceCall(remote_address);
  218. }
  219. break;
  220. /* options */
  221. case 'o':
  222. case 'O':
  223.             {
  224.                 UICmdCtrl *msg = new UICmdCtrl;
  225. char *command_string = command;
  226. char *current_word;
  227. int i = 0;
  228. current_word = strtok(command_string," "); 
  229. // skip the first word, since it is the command letter O
  230. while ((current_word = strtok(NULL," ")) != NULL)
  231. {
  232. if (strcmp(current_word, "enable_faststart") == 0)
  233. {
  234. msg->command[i] = UI_CTRL_CMD_ENABLE_FASTSTART;
  235. }
  236. else if (strcmp(current_word, "disable_faststart") == 0)
  237. {
  238. msg->command[i] = UI_CTRL_CMD_DISABLE_FASTSTART;
  239. }
  240. else if (strcmp(current_word, "enable_overlapsend") == 0)
  241. {
  242. msg->command[i] = UI_CTRL_CMD_ENABLE_OVERLAP_SEND;
  243. }
  244. else if (strcmp(current_word, "disable_overlapsend") == 0)
  245. {
  246. msg->command[i] = UI_CTRL_CMD_DISABLE_OVERLAP_SEND;
  247. }
  248. else if (strcmp(current_word, "enable_tunneling") == 0)
  249. {
  250. msg->command[i] = UI_CTRL_CMD_ENABLE_TUNNELING;
  251. }
  252. else if (strcmp(current_word, "disable_tunneling") == 0)
  253. {
  254. msg->command[i] = UI_CTRL_CMD_DISABLE_TUNNELING;
  255. }
  256. else if (strcmp(current_word, "enable_alerting") == 0)
  257. {
  258. msg->command[i] = UI_CTRL_CMD_ENABLE_ALERTING;
  259. }
  260. else if (strcmp(current_word, "disable_alerting") == 0)
  261. {
  262. msg->command[i] = UI_CTRL_CMD_DISABLE_ALERTING;
  263. }
  264. else if (strcmp(current_word, "enable_callproc") == 0)
  265. {
  266. msg->command[i] = UI_CTRL_CMD_ENABLE_CALLPROC;
  267. }
  268. else if (strcmp(current_word, "disable_callproc") == 0)
  269. {
  270. msg->command[i] = UI_CTRL_CMD_DISABLE_CALLPROC;
  271. }
  272. else
  273. {
  274. fprintf(stderr,"Unknown option to the 'o' command %sn",
  275. current_word);
  276. continue;
  277. }
  278. ++i;
  279. }
  280.                 if (i > 0)
  281.                 {
  282. msg->num_cmds = i;
  283.                  SendToExchange(PROT_UI_MSG, UI_CMD_CTRL, (unsigned int)msg);
  284.                 }
  285. else
  286. {
  287. fprintf(stderr,"must provide one or more options for on"
  288. "t enable_faststart, disable_faststart, n"
  289. "t enable_tunneling, disable_tunneling, n"
  290. "t enable_overlapsend, disable_overlapsend,n"
  291. "t enable_alerting, disable_alerting,n"
  292. "t enable_callproc, disable_callproc,n");
  293. }
  294.             }
  295. break;
  296. case 's':
  297. case 'S':
  298. #if (defined(unix) || defined(WIN32) || defined(VXWORKS) || defined (__hpux))
  299. if (1)
  300. {
  301. /*
  302.  * Note that this command blocks the user interface thread.
  303.  * Also it always drops line 0. So dont use any other command
  304.  * other than x/X while using this command.
  305.  */
  306. char remote[256];
  307. int count = 1;
  308. unsigned int remote_address;
  309. sscanf(command+1,"%s%d",remote, &count);
  310. if (count <= 0)
  311. {
  312. printf("count must be a positive integern");
  313. break;
  314. }
  315. remote_address = HostNameToIP(remote);
  316. while (count-- > 0) 
  317. {
  318. printf("calling %s, iteration = %dn", remote, count+1);
  319. PlaceCall(remote_address);
  320. // wait for the call to go through before hanging up.
  321. mydelay(7);
  322. printf("hanging up %sn", remote);
  323. DropCall(0);
  324. // wait for some time for the hangup to go through.
  325. mydelay(3);
  326. }
  327. }
  328. #if !defined(VXWORKS)
  329. else
  330. {
  331. char filename[256];
  332. FILE *fp;
  333. int times = 0;
  334. int nhosts = 0;
  335. unsigned int *addr_list = NULL;
  336. int i;
  337. sscanf(command+1,"%s",filename);
  338. fp = fopen(filename,"r");
  339. if (fp == NULL)
  340. {
  341. printf("Cannot open file %sn",filename);
  342. continue;
  343. }
  344. fscanf(fp,"%d%d",&times,&nhosts);
  345. printf("Will readin %d hostnamesn",nhosts);
  346. addr_list = new unsigned int[nhosts];
  347. if (addr_list == NULL)
  348. {
  349. continue;
  350. }
  351. for (i=0;i<nhosts;++i)
  352. {
  353. char ip[100];
  354. fscanf(fp,"%s",ip);
  355. addr_list[i] = HostNameToIP(ip);
  356. }
  357. fclose(fp);
  358. while(--times >= 0)
  359. {
  360. printf("Iteration %dn",times);
  361. for(i=0;i<nhosts;++i)
  362. {
  363. PlaceCall(addr_list[i]);
  364. }
  365. // wait for the calls to go through before hanging up.
  366. mydelay(7);
  367. printf("Hanging up callsn");
  368. for(i=0;i<nhosts;++i)
  369. {
  370. DropCall(i);
  371. }
  372. // wait for some time for the hangup to go through.
  373. mydelay(3);
  374. }
  375. }
  376. #endif
  377. #else
  378. printf("This command is not supported in this operating systemn");
  379. #endif
  380. break;
  381. case 'n':
  382. case 'N':
  383. {
  384. char remote[256];
  385. unsigned int remote_address;
  386. int count = 1;
  387. int delay = 0;
  388. int repeat_count = 0;
  389. // if we don't use gk remote is the IP, else remote is the e164 alias
  390. sscanf(command+1,"%s%d%d%d",remote,&count,
  391. &repeat_count,&delay);
  392. if (count <= 0)
  393. {
  394. printf("count must be a positive integern");
  395. break;
  396. }
  397. #if defined(USE_RAS)
  398. if (!IsGKRegistered()) // the user must have provided IP as "remote" field
  399. remote_address = HostNameToIP(remote);
  400. #else // if no ras at all, user always provides IP as "remote" field
  401. remote_address = HostNameToIP(remote);
  402. #endif
  403. do
  404. {
  405. int tmp_count = count;
  406. while (tmp_count > 0)
  407. {
  408. #if defined(USE_RAS)
  409. if (!IsGKRegistered())
  410. PlaceCall(remote_address);
  411. else
  412. PlaceCall(NULL, remote);
  413. #else
  414. PlaceCall(remote_address);
  415. #endif
  416. --tmp_count;
  417. }
  418. mydelay(delay);
  419. if (repeat_count > 0)
  420. {
  421. int i;
  422. --repeat_count;
  423. // We will always try to drop
  424. // the first count*2 calls.
  425. // This is done to take care 
  426. // of clearing localhost calls
  427. // properly.
  428. for (i=0;i<count*2;++i)
  429. {
  430. DropCall(i);
  431. }
  432. mydelay((delay/2 > 0) ? (delay/2) : 1);
  433. if (repeat_count == 0)
  434. {
  435. break;
  436. }
  437. printf("%d iterations leftn",repeat_count);
  438. }
  439. else
  440. {
  441. break;
  442. }
  443. }while (1);
  444. }
  445. break;
  446. case 'g':
  447. case 'G':
  448. {
  449. char gw[256];
  450. char phone[256];
  451. sscanf(command+1,"%s %s",gw,phone);
  452. PlaceCall(HostNameToIP(gw),phone);
  453. }
  454. break;
  455. #if defined(USE_RAS)
  456. case 'm':
  457. case 'M':
  458. {
  459. char phone[256];
  460. sscanf(command+1,"%s",phone);
  461. PlaceCall(NULL,phone);
  462. }
  463. break;
  464. #endif
  465. case 'd':
  466. case 'D':
  467. {
  468. int l = 0;
  469. int u = -1;
  470. if (sscanf(command + 1,"%d%d",&l,&u) == 1)
  471. {
  472. u = l;
  473. }
  474. if (l <= u)
  475. {
  476. while((l<=u) && (l >=0 && l < NUM_LINES))
  477. {
  478. DropCall(l);
  479. ++l;
  480. }
  481. }
  482. else
  483. {
  484. printf("??n");
  485. }
  486. }
  487. break;
  488. case 't':
  489. case 'T':
  490. {
  491. int l = 0;
  492. char args[80];
  493. char *p;
  494. H450SSseq *ssSeq;
  495. H4501SuppService *ss;
  496. int invokeID = 0;
  497. char *callid = "";
  498. unsigned int ip;
  499. char *e164 = "";
  500. if (sscanf(command + 1,"%d %s", &l, args) < 2)
  501. {
  502. printf("Use one of:   %c lineno ipn",command[0]);
  503. printf("              %c lineno hostnamen",command[0]);
  504. printf("              %c lineno e164n",command[0]);
  505. break;
  506. }
  507. p = args;
  508. if(strchr(p,'.') != NULL) {
  509. // Assume this is an IP address
  510. ip = inet_addr(p);
  511. e164 = NULL;
  512. } else if(isalpha(p[0])) {
  513. // Assume this is a hostname
  514. ip = HostNameToIP(p);
  515. e164 = NULL;
  516. } else if(strcspn(p,"#*0123456789,") == strlen(p)) {
  517. // Assume e164
  518. ip = 0;
  519. e164 = p;
  520. } else {
  521. break;
  522. }
  523. ss = ctInitiateInvoke(invokeID, callid, ip, e164);
  524. ssSeq = new H450SSseq;
  525. ssSeq->next = NULL;
  526. ssSeq->value = ss;
  527. if(ssSeq != NULL) {
  528. SendFacility(l, ssSeq);
  529. }
  530. }
  531. break;
  532. case 'x':
  533. case 'X':
  534. {
  535. ShutDown();
  536. return;
  537. }
  538. /*NOTREACHED*/
  539. break;
  540. case 'l':
  541. case 'L':
  542. {
  543. int i;
  544. int prn = 0;
  545. int num_calls = 0;
  546. unsigned int min_sec = 0;
  547. unsigned min_msec = 0;
  548. unsigned int max_sec = 0;
  549. unsigned max_msec = 0;
  550. for(i=0;i<NUM_LINES;++i)
  551. {
  552. if (calls[i])
  553. {
  554. #if (defined(ENABLE_BENCHMARKS))
  555. unsigned int cpt = my_difftime(
  556. calls[i]->st_sec,
  557. calls[i]->st_msec,
  558. calls[i]->end_sec,
  559. calls[i]->end_msec);
  560. if (min_sec == 0)
  561. {
  562. min_sec = calls[i]->st_sec;
  563. min_msec = calls[i]->st_msec;
  564. }
  565. if ((min_sec >= calls[i]->st_sec) &&
  566. (min_msec > calls[i]->st_msec))
  567. {
  568. min_sec = calls[i]->st_sec;
  569. min_msec = calls[i]->st_msec;
  570. }
  571. if ((max_sec <= calls[i]->end_sec) &&
  572. (max_msec < calls[i]->end_msec))
  573. {
  574. max_sec = calls[i]->end_sec;
  575. max_msec = calls[i]->end_msec;
  576. }
  577. ++num_calls;
  578. if (cpt > 0)
  579. {
  580. printf("%s%s%d(%dms)(%d/%d) ",
  581. calls[i]->GetRemoteName(),
  582. calls[i]->IsAudioSessionRunning() ?
  583. "=" : "-",i,cpt,calls[i]->cur_stack_size,
  584. calls[i]->max_stack_size);
  585. }
  586. else
  587. {
  588. printf("%s%s%d(%d/%d) ",calls[i]->GetRemoteName(),
  589. calls[i]->IsAudioSessionRunning() ? "=" : "-",
  590. i, calls[i]->cur_stack_size,
  591. calls[i]->max_stack_size);
  592. }
  593. #else
  594. ++num_calls;
  595. printf("%s%s%d ",calls[i]->GetRemoteName(),
  596. calls[i]->IsAudioSessionRunning() ? "=" : "-", i);
  597. #endif
  598. ++prn;
  599. if ((prn%2) == 0)
  600. {
  601. printf("n");
  602. }
  603. }
  604. }
  605. #if (defined(ENABLE_BENCHMARKS))
  606. if (num_calls > 0)
  607. {
  608. printf("n%d call(s) %dmsn",num_calls,
  609. my_difftime(min_sec,min_msec,max_sec,max_msec));
  610. }
  611. #endif
  612. }
  613. break;
  614. case '!':
  615. {
  616. strcpy(command,save);
  617. printf("%sn",command);
  618. goto again;
  619. }
  620. /*NOTREACHED*/
  621. break;
  622. case '?':
  623. case 'h':
  624. case 'H':
  625. {
  626. printf("c host-  calln");
  627. #if defined(USE_RAS)
  628. if (IsGKRegistered())
  629. printf("m phone- call using gatekeepern");
  630. #endif
  631. printf("d lineno- drop calln");
  632. printf("l-  list callsn");
  633. printf("o <options>-  set exchange options, type o for helpn");
  634. printf("t lineno transfered-to_ip -  transfer call n");
  635. printf("                           (no args for help)n");
  636. printf("!-  repeat previous commandn");
  637. printf("x-  Exit shelln");
  638. }
  639. default:
  640. printf("??n");
  641. break;
  642. }
  643. strcpy(save,command);
  644. }
  645. }
  646. void
  647. Exchange::PlaceCall(unsigned int ip,char *phone, int faststart)
  648. {
  649. UICmdPlaceCall *msg = new UICmdPlaceCall;
  650. msg->remote_addr.sin_family = AF_INET;
  651. msg->remote_addr.sin_port = HTONS(1720);
  652. msg->remote_addr.sin_addr.s_addr = ip;
  653. msg->do_faststart = faststart;
  654. msg->transfer_flag = FALSE;
  655. if (phone)
  656. {
  657. strcpy(msg->dest_addr,phone);
  658. msg->dest_addr_length = strlen(phone);
  659. }
  660. else
  661. {
  662. msg->dest_addr_length = 0;
  663. }
  664. SendToExchange(PROT_UI_MSG,UI_CMD_PLACE_CALL,
  665. (unsigned int)msg);
  666. }
  667. void
  668. Exchange::PlaceTransferedToCall(int parent_index, unsigned int ip,char *phone, int invokeID, char *callID)
  669. {
  670. UICmdPlaceCall *msg = new UICmdPlaceCall;
  671. msg->remote_addr.sin_family = AF_INET;
  672. msg->remote_addr.sin_port = HTONS(1720);
  673. msg->remote_addr.sin_addr.s_addr = ip;
  674. if (phone)
  675. {
  676. strcpy(msg->dest_addr,phone);
  677. msg->dest_addr_length = strlen(phone);
  678. }
  679. else
  680. {
  681. msg->dest_addr_length = 0;
  682. }
  683. msg->transfer_flag = TRUE;
  684. msg->invokeID = invokeID;
  685. if (callID)
  686. strncpy(msg->callID, callID, 5);
  687. msg->parent_index = parent_index;
  688. SendToExchange(PROT_UI_MSG,UI_CMD_PLACE_CALL,
  689. (unsigned int)msg);
  690. }
  691. void Exchange::DropTranferringCall(int line_no)
  692. {
  693. UICmdHangup *msg = new UICmdHangup;
  694. msg->line_no = line_no;
  695. msg->transfer_flag = TRUE;
  696. SendToExchange(PROT_UI_MSG,UI_CMD_HANGUP,
  697. (unsigned int)msg);
  698. }
  699. void Exchange::DropCall(int line_no)
  700. {
  701. UICmdHangup *msg = new UICmdHangup;
  702. msg->line_no = line_no;
  703. SendToExchange(PROT_UI_MSG,UI_CMD_HANGUP,
  704. (unsigned int)msg);
  705. }
  706. void
  707. Exchange::SendFacility(int lineno, H450SSseq *ssSeq)
  708. {
  709. UICmdFacility *msg = new UICmdFacility;
  710. msg->line_no = lineno;
  711. msg->suppsvcs = ssSeq;
  712. SendToExchange(PROT_UI_MSG,UI_CMD_FACILITY,
  713. (unsigned int)msg);
  714. }
  715. unsigned int 
  716. HostNameToIP(char *hostname)
  717. {
  718. unsigned int remote_address = inet_addr(hostname);
  719. #if !defined(VXWORKS)
  720. if (remote_address == INADDR_NONE)
  721. {
  722. hostent
  723. *hent_p = gethostbyname(hostname);
  724. if(hent_p == NULL)
  725. {
  726. printf("gethostbyname failed on %s error %dn",
  727. hostname,errno);
  728. return remote_address;
  729. }
  730. remote_address = *(unsigned long *)(hent_p->h_addr_list[0]);
  731. }
  732. #else
  733. if ( remote_address == INADDR_NONE)
  734. {
  735. remote_address = hostGetByName(hostname);
  736. if ( remote_address == INADDR_NONE)
  737. {
  738. printf("hostGetByName failed on %s error %dn",
  739.                 hostname,errno);
  740.             return remote_address;
  741.         }
  742. }
  743. #endif
  744. return remote_address;
  745. }
  746. #if defined(VXWORKS)
  747. BOOL
  748. IsValidMemBlock(void *ptr)
  749. {
  750. PART_ID partId;
  751. BLOCK_HDR * pHdr;
  752. BOOL on_free_list,on_alloc_list;
  753. partId = memSysPartId;
  754. pHdr = BLOCK_TO_HDR(ptr);
  755. semTake (&(partId->sem), WAIT_FOREVER);
  756. on_alloc_list = memPartBlockIsValid (partId, pHdr, FALSE);
  757. on_free_list = memPartBlockIsValid (partId, pHdr, TRUE);
  758. semGive (&(partId->sem));
  759. if (on_alloc_list || on_free_list)
  760. {
  761. return TRUE;
  762. }
  763. else
  764. {
  765. return FALSE;
  766. }
  767. }
  768. #endif
  769. #if !defined(VXWORKS)
  770. void show_usage (const char * progname)
  771. {
  772.   fprintf (stderr, 
  773.   "Usage: %s [-q #] [-e e164] [-h h323ID] [-r #] [-g gkaddr] [-d] [-v] n"
  774.    "  where -q # is the Q.931 signaling port (default 1720)n"
  775.    "        -e e164 is the E.164 prefix phone number (default 555),n"
  776.    "           the app will append numbers 0000-NUM_PORTS e.g. 0000-2000n"
  777.    "        -h h323ID is the H.323 alias (default elemedia),n"
  778. #if defined(USE_RAS)
  779.    "        -r # is the local RAS port (default 1719)n"
  780.    "        -g x.x.x.x is the gatekeeper IP addr for manual RRQ(default 127.0.0.1)n"
  781.    "        -d (discover) discover gatekeeper and register with anyone responded,n"
  782.    "            Note that this option overrides -gn" 
  783. #endif
  784.    "        -v (verbose) displays event informationnn",
  785.    progname);
  786. }
  787. int parse_command_line (int argc, char * argv [])
  788. {
  789. int opt;
  790. int need_usage = 0;
  791. #if defined(USE_RAS)
  792. while ((opt = getopt (argc, argv, "e:h:g:r:q:dv?")) != EOF)
  793. #else
  794. while ((opt = getopt (argc, argv, "e:h:q:v?")) != EOF)
  795. #endif
  796. {
  797. switch (opt)
  798. {
  799. case 'q':
  800. {
  801. if (sscanf (optarg, "%ul", &config->q931port) < 1)
  802. {
  803. LOG_ERROR("%s: bad q931port option: %sn", argv [0], optarg);
  804. need_usage = 1;
  805. }
  806. else
  807. printf("q931port=<%d>n", config->q931port);
  808. break;
  809. }
  810. case 'e':
  811. {
  812. if (sscanf (optarg, "%s", &config->e164src[0]) < 1)
  813. {
  814. LOG_ERROR("%s: bad e164 alias option: %sn", argv [0], optarg);
  815. need_usage = 1;
  816. }
  817. else
  818. printf("e164src=<%s>n", config->e164src);
  819. break;
  820. }
  821. case 'h':
  822. {
  823. if (sscanf (optarg, "%s", &config->h323IDsrc[0]) < 1)
  824. {
  825. LOG_ERROR("%s: bad h323 alias option: %sn", argv [0], optarg);
  826. need_usage = 1;
  827. }
  828. else
  829. printf("h323IDsrc=<%s>n", config->h323IDsrc);
  830. break;
  831. }
  832. #if defined(USE_RAS)
  833. case 'g':
  834. {
  835. if (sscanf (optarg, "%s", &config->gkaddrstr[0]) < 1)
  836. {
  837. LOG_ERROR("%s: bad gkaddrstr option: %sn", argv [0], optarg);
  838. need_usage = 1;
  839. }
  840. else
  841. printf("gkaddrstr=<%s>n", config->gkaddrstr);
  842. break;
  843. }
  844. case 'r':
  845. {
  846. if (sscanf (optarg, "%ul", &config->localrasport) < 1)
  847. {
  848. LOG_ERROR("%s: bad localrasport option: %sn", argv [0], optarg);
  849. need_usage = 1;
  850. }
  851. else
  852. printf("localrasport=<%d>n", config->localrasport);
  853. break;
  854. }
  855. case 'd':
  856. {
  857. config->discoverGK = TRUE;
  858. break;
  859. }
  860. #endif
  861. case 'v':
  862. {
  863. config->verbose = TRUE;
  864. break;
  865. }
  866. case '?':
  867. default:
  868. {
  869. need_usage = 1;
  870. break;
  871. }
  872. }
  873.   }
  874.   return need_usage;
  875. }
  876. #endif