main.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "iniparser.h"
  6. #define Boolean int
  7. #define TRUE 1
  8. #define FALSE 0
  9. #define ALSA_DEF "alsa,default"
  10. #define ALSA_PLUGHW "alsa,default"
  11. #define SPK_CONF "/oem/etc/speaker.conf"
  12. #define ACC_CONF "/tmp/accounts"
  13. #define SPHONE_MODULE_CONF "/tmp/config"
  14. struct sip_account
  15. {
  16. char enable[8];
  17. char username[64];
  18. char authuser[64];
  19. char domain[128];
  20. char passwd[64];
  21. char server[128];
  22. char port[8];
  23. char reg_expires[8];
  24. char transport[8];
  25. char autoanswer[8];
  26. char sip_autoanswer[8];
  27. char ringfile[64];
  28. char nat_mode[16];
  29. char stun_server[64];
  30. char stun_port[8];
  31. char nat_username[64];
  32. char nat_password[64];
  33. char keepalive[8];
  34. char ka_interval[8];
  35. };
  36. struct sip_p2p
  37. {
  38. char enable[8];
  39. char username[64];
  40. char auth[8];
  41. char transport[8];
  42. char autoanswer[8];
  43. char sip_autoanswer[8];
  44. char ringfile[64];
  45. };
  46. struct SPEAKER_CONF
  47. {
  48. char hw_version[16];
  49. char dev_type[32];
  50. char version[16];
  51. char mac[16];
  52. char localport[8];
  53. char startport[8];
  54. char endport[8];
  55. char rtptimeout[8];
  56. char jbufftype[16];
  57. struct sip_account acc1;
  58. struct sip_account acc2;
  59. struct sip_account acc3;
  60. struct sip_p2p p2p;
  61. char g722[8];
  62. char alaw[8];
  63. char ulaw[8];
  64. char opus[8];
  65. char g729[8];
  66. char aec[8];
  67. char anr[8];
  68. char agc[8];
  69. char cng[8];
  70. char agc_max_gain[4];
  71. char agc_gate_threshold[4];
  72. char volume[4];
  73. char end_beep[4];
  74. char second_call[16];
  75. };
  76. /*
  77. * @cmd 执行命令
  78. * @value 命令结果指针
  79. * @lenth 存储结果长度
  80. */
  81. int GetCmdValue(char *cmd, char *value, int lenth)
  82. {
  83. bzero(value, lenth);
  84. FILE *fp = popen(cmd,"r");
  85. if(fp){
  86. fread(value, 1, lenth, fp);
  87. pclose(fp);
  88. } else {
  89. printf("Handle \"%s\" failed.\n", cmd);
  90. return FALSE;
  91. }
  92. return TRUE;
  93. }
  94. struct SPEAKER_CONF confParse()
  95. {
  96. struct SPEAKER_CONF conf;
  97. dictionary * ini ;
  98. ini = iniparser_load(SPK_CONF);
  99. if (ini==NULL) {
  100. fprintf(stderr, "cannot parse file: %s\n", SPK_CONF);
  101. exit(-1);
  102. }
  103. strcpy(conf.dev_type, iniparser_getstring(ini, "system:model", ""));
  104. strcpy(conf.hw_version, iniparser_getstring(ini, "system:hard_version", ""));
  105. strcpy(conf.version, iniparser_getstring(ini, "system:firmware", ""));
  106. GetCmdValue("ifconfig eth0 | grep HWaddr | awk '{print $5}' | tr -d ':' | tr -d '\n'",conf.mac, sizeof(conf.mac));
  107. strcpy(conf.localport, iniparser_getstring(ini, "sip_advance:localport", ""));
  108. strcpy(conf.startport, iniparser_getstring(ini, "sip_advance:rtpstartport", ""));
  109. strcpy(conf.endport, iniparser_getstring(ini, "sip_advance:rtpendport", ""));
  110. strcpy(conf.rtptimeout, iniparser_getstring(ini, "sip_advance:rtptimeout", ""));
  111. strcpy(conf.jbufftype, iniparser_getstring(ini, "sip_advance:jbufftype", "off"));
  112. strcpy(conf.acc1.enable, iniparser_getstring(ini, "account_info_1:enable", "no"));
  113. if(strcmp(conf.acc1.enable, "yes") == 0)
  114. {
  115. strcpy(conf.acc1.username, iniparser_getstring(ini, "account_info_1:username", ""));
  116. strcpy(conf.acc1.authuser, iniparser_getstring(ini, "account_info_1:authuser", ""));
  117. if(strlen(conf.acc1.authuser) == 0)
  118. {
  119. strcpy(conf.acc1.authuser, conf.acc1.username);
  120. }
  121. GetCmdValue("sysconf /etc/speaker.conf get account_info_1 passwd", conf.acc1.passwd, sizeof(conf.acc1.passwd));
  122. //strcpy(conf.acc1.passwd, iniparser_getstring(ini, "account_info_1:passwd", ""));
  123. strcpy(conf.acc1.server, iniparser_getstring(ini, "account_info_1:server", ""));
  124. strcpy(conf.acc1.port, iniparser_getstring(ini, "account_info_1:port", ""));
  125. strcpy(conf.acc1.domain, iniparser_getstring(ini, "account_info_1:domain", ""));
  126. if(strlen(conf.acc1.domain) == 0)
  127. {
  128. strcpy(conf.acc1.domain, conf.acc1.server);
  129. }
  130. strcpy(conf.acc1.reg_expires, iniparser_getstring(ini, "account_info_1:reg_expires", ""));
  131. strcpy(conf.acc1.transport, iniparser_getstring(ini, "account_info_1:transport", ""));
  132. strcpy(conf.acc1.autoanswer, iniparser_getstring(ini, "account_info_1:autoanswer", ""));
  133. strcpy(conf.acc1.sip_autoanswer, iniparser_getstring(ini, "account_info_1:sip_autoanswer", "yes"));
  134. strcpy(conf.acc1.ringfile, iniparser_getstring(ini, "account_info_1:ringfile", ""));
  135. strcpy(conf.acc1.nat_mode, iniparser_getstring(ini, "account_info_1:nat_mode", "disabled"));
  136. strcpy(conf.acc1.stun_server, iniparser_getstring(ini, "account_info_1:stun_server", ""));
  137. strcpy(conf.acc1.stun_port, iniparser_getstring(ini, "account_info_1:stun_port", "3478"));
  138. strcpy(conf.acc1.nat_username, iniparser_getstring(ini, "account_info_1:nat_username", ""));
  139. strcpy(conf.acc1.nat_password, iniparser_getstring(ini, "account_info_1:nat_password", ""));
  140. strcpy(conf.acc1.keepalive, iniparser_getstring(ini, "account_info_1:keepalive", "yes"));
  141. strcpy(conf.acc1.ka_interval, iniparser_getstring(ini, "account_info_1:keepalive_interval", "30"));
  142. }
  143. strcpy(conf.acc2.enable, iniparser_getstring(ini, "account_info_2:enable", "no"));
  144. if(strcmp(conf.acc2.enable, "yes") == 0)
  145. {
  146. strcpy(conf.acc2.username, iniparser_getstring(ini, "account_info_2:username", ""));
  147. strcpy(conf.acc2.authuser, iniparser_getstring(ini, "account_info_2:authuser", ""));
  148. if(strlen(conf.acc2.authuser) == 0)
  149. {
  150. strcpy(conf.acc2.authuser, conf.acc2.username);
  151. }
  152. GetCmdValue("sysconf /etc/speaker.conf get account_info_2 passwd", conf.acc2.passwd, sizeof(conf.acc2.passwd));
  153. //strcpy(conf.acc2.passwd, iniparser_getstring(ini, "account_info_2:passwd", ""));
  154. strcpy(conf.acc2.server, iniparser_getstring(ini, "account_info_2:server", ""));
  155. strcpy(conf.acc2.port, iniparser_getstring(ini, "account_info_2:port", ""));
  156. strcpy(conf.acc2.domain, iniparser_getstring(ini, "account_info_2:domain", ""));
  157. if(strlen(conf.acc2.domain) == 0)
  158. {
  159. strcpy(conf.acc2.domain, conf.acc2.server);
  160. }
  161. strcpy(conf.acc2.reg_expires, iniparser_getstring(ini, "account_info_2:reg_expires", ""));
  162. strcpy(conf.acc2.transport, iniparser_getstring(ini, "account_info_2:transport", ""));
  163. strcpy(conf.acc2.autoanswer, iniparser_getstring(ini, "account_info_2:autoanswer", ""));
  164. strcpy(conf.acc2.sip_autoanswer, iniparser_getstring(ini, "account_info_2:sip_autoanswer", "yes"));
  165. strcpy(conf.acc2.ringfile, iniparser_getstring(ini, "account_info_2:ringfile", ""));
  166. strcpy(conf.acc2.nat_mode, iniparser_getstring(ini, "account_info_2:nat_mode", "disabled"));
  167. strcpy(conf.acc2.stun_server, iniparser_getstring(ini, "account_info_2:stun_server", ""));
  168. strcpy(conf.acc2.stun_port, iniparser_getstring(ini, "account_info_2:stun_port", "3478"));
  169. strcpy(conf.acc2.nat_username, iniparser_getstring(ini, "account_info_2:nat_username", ""));
  170. strcpy(conf.acc2.nat_password, iniparser_getstring(ini, "account_info_2:nat_password", ""));
  171. strcpy(conf.acc2.keepalive, iniparser_getstring(ini, "account_info_2:keepalive", "yes"));
  172. strcpy(conf.acc2.ka_interval, iniparser_getstring(ini, "account_info_2:keepalive_interval", "30"));
  173. }
  174. strcpy(conf.acc3.enable, iniparser_getstring(ini, "account_info_3:enable", "no"));
  175. if(strcmp(conf.acc3.enable, "yes") == 0)
  176. {
  177. strcpy(conf.acc3.username, iniparser_getstring(ini, "account_info_3:username", ""));
  178. strcpy(conf.acc3.authuser, iniparser_getstring(ini, "account_info_3:authuser", ""));
  179. if(strlen(conf.acc3.authuser) == 0)
  180. {
  181. strcpy(conf.acc3.authuser, conf.acc3.username);
  182. }
  183. GetCmdValue("sysconf /etc/speaker.conf get account_info_3 passwd", conf.acc3.passwd, sizeof(conf.acc3.passwd));
  184. //strcpy(conf.acc3.passwd, iniparser_getstring(ini, "account_info_3:passwd", ""));
  185. strcpy(conf.acc3.server, iniparser_getstring(ini, "account_info_3:server", ""));
  186. strcpy(conf.acc3.port, iniparser_getstring(ini, "account_info_3:port", ""));
  187. strcpy(conf.acc3.domain, iniparser_getstring(ini, "account_info_3:domain", ""));
  188. if(strlen(conf.acc3.domain) == 0)
  189. {
  190. strcpy(conf.acc3.domain, conf.acc3.server);
  191. }
  192. strcpy(conf.acc3.reg_expires, iniparser_getstring(ini, "account_info_3:reg_expires", ""));
  193. strcpy(conf.acc3.transport, iniparser_getstring(ini, "account_info_3:transport", ""));
  194. strcpy(conf.acc3.autoanswer, iniparser_getstring(ini, "account_info_3:autoanswer", ""));
  195. strcpy(conf.acc3.sip_autoanswer, iniparser_getstring(ini, "account_info_3:sip_autoanswer", "yes"));
  196. strcpy(conf.acc3.ringfile, iniparser_getstring(ini, "account_info_3:ringfile", ""));
  197. strcpy(conf.acc3.nat_mode, iniparser_getstring(ini, "account_info_3:nat_mode", "disabled"));
  198. strcpy(conf.acc3.stun_server, iniparser_getstring(ini, "account_info_3:stun_server", ""));
  199. strcpy(conf.acc3.stun_port, iniparser_getstring(ini, "account_info_3:stun_port", "3478"));
  200. strcpy(conf.acc3.nat_username, iniparser_getstring(ini, "account_info_3:nat_username", ""));
  201. strcpy(conf.acc3.nat_password, iniparser_getstring(ini, "account_info_3:nat_password", ""));
  202. strcpy(conf.acc3.keepalive, iniparser_getstring(ini, "account_info_3:keepalive", "yes"));
  203. strcpy(conf.acc3.ka_interval, iniparser_getstring(ini, "account_info_3:keepalive_interval", "30"));
  204. }
  205. strcpy(conf.p2p.enable, iniparser_getstring(ini, "account_info_p2p:enable", "no"));
  206. strcpy(conf.p2p.username, iniparser_getstring(ini, "account_info_p2p:username", ""));
  207. strcpy(conf.p2p.auth, iniparser_getstring(ini, "account_info_p2p:auth", "no"));
  208. strcpy(conf.p2p.transport, iniparser_getstring(ini, "account_info_p2p:transport", ""));
  209. strcpy(conf.p2p.autoanswer, iniparser_getstring(ini, "account_info_p2p:autoanswer", ""));
  210. strcpy(conf.p2p.sip_autoanswer, iniparser_getstring(ini, "account_info_p2p:sip_autoanswer", "yes"));
  211. strcpy(conf.p2p.ringfile, iniparser_getstring(ini, "account_info_p2p:ringfile", ""));
  212. strcpy(conf.g722, iniparser_getstring(ini, "codec:g722", "yes"));
  213. strcpy(conf.alaw, iniparser_getstring(ini, "codec:alaw", "yes"));
  214. strcpy(conf.ulaw, iniparser_getstring(ini, "codec:ulaw", "yes"));
  215. strcpy(conf.opus, iniparser_getstring(ini, "codec:opus", "no"));
  216. strcpy(conf.g729, iniparser_getstring(ini, "codec:g729", "no"));
  217. strcpy(conf.aec, iniparser_getstring(ini, "sip_advance:echocancel", "yes"));
  218. strcpy(conf.anr, iniparser_getstring(ini, "sip_advance:anr", "yes"));
  219. strcpy(conf.agc, iniparser_getstring(ini, "sip_advance:agc", "no"));
  220. strcpy(conf.agc_max_gain, iniparser_getstring(ini, "sip_advance:agc_max_gain", "30"));
  221. strcpy(conf.agc_gate_threshold, iniparser_getstring(ini, "sip_advance:agc_gate_threshold", "-65"));
  222. strcpy(conf.cng, iniparser_getstring(ini, "sip_advance:cng", "no"));
  223. strcpy(conf.end_beep, iniparser_getstring(ini, "sip_function:hangup_beep", "no"));
  224. strcpy(conf.second_call, iniparser_getstring(ini, "sip_function:second_call", "hangup"));
  225. GetCmdValue("sysconf /oem/etc/volctrl.conf get volume sip_volume",conf.volume, sizeof(conf.volume));
  226. if(strlen(conf.volume) == 0)
  227. {
  228. strcpy(conf.volume, "90");
  229. }
  230. iniparser_freedict(ini);
  231. return conf;
  232. }
  233. int main(int argc, char *argv[]){
  234. char audio_src[32], lport_line[32] = "", acc1_answermode[32], acc2_answermode[32], acc3_answermode[32], p2p_answermode[32],\
  235. acc1_natstring[256] = "", acc2_natstring[256] = "", acc3_natstring[256] = "", acc1_extrastring[64] = "", acc2_extrastring[64] = "",\
  236. acc3_extrastring[64] = "", nat_tmp[256], codecs[64], localip[32], sec_call[128] = "";
  237. struct SPEAKER_CONF conf;
  238. conf = confParse();
  239. FILE *phone_modules_fp = fopen(SPHONE_MODULE_CONF, "w+");
  240. if (phone_modules_fp == NULL){
  241. perror("Open phone module conf file Error: ");
  242. exit(1);
  243. }
  244. // if(strcmp(conf.echocancel,"yes") == 0)
  245. // {
  246. // strcpy(audio_src,ALSA_DEF);
  247. // }
  248. // else
  249. // {
  250. strcpy(audio_src,ALSA_PLUGHW);
  251. // }
  252. if(strlen(conf.localport) != 0 && strcmp(conf.localport,"0") != 0)
  253. {
  254. sprintf(lport_line,"sip_listen 0.0.0.0:%s", conf.localport);
  255. }
  256. if(strcmp(conf.second_call, "hangup") == 0)
  257. {
  258. sprintf(sec_call, "call_max_calls 1");
  259. }
  260. else if(strcmp(conf.second_call, "hold") == 0)
  261. {
  262. sprintf(sec_call, "call_max_calls 2");
  263. }
  264. else if(strcmp(conf.second_call, "merge") == 0)
  265. {
  266. sprintf(sec_call, "\
  267. call_max_calls 2\n\
  268. call_hold_other_calls no");
  269. }
  270. else
  271. {
  272. sprintf(sec_call, "call_max_calls 1");
  273. }
  274. fprintf(phone_modules_fp, "\
  275. poll_method epoll\n\
  276. %s\n\
  277. sip_certificate /etc/ssl/certs/cert.pem\n\
  278. \n\
  279. call_local_timeout 120\n\
  280. %s\n\
  281. \n\
  282. # Audio\n\
  283. audio_path /usr/share/baresip\n\
  284. audio_player alsa,default\n\
  285. audio_source %s\n\
  286. audio_alert alsa,default\n\
  287. auplay_channels 1\n\
  288. audio_level no\n\
  289. ausrc_format s16\n\
  290. auplay_format s16\n\
  291. auenc_format s16\n\
  292. audec_format s16\n\
  293. audio_buffer 20-120\n\
  294. audio_buffer_mode adaptive\n\
  295. \n\
  296. # AVT - Audio/Video Transport\n\
  297. rtp_tos 184\n\
  298. rtp_ports %s-%s\n\
  299. rtcp_mux no\n\
  300. audio_jitter_buffer_type %s\n\
  301. audio_jitter_buffer_delay 0-6\n\
  302. rtp_stats no\n\
  303. rtp_timeout %s\n\
  304. \n\
  305. #------------------------------------------------------------------------------\n\
  306. # Speaker\n\
  307. model %s\n\
  308. version %s\n\
  309. dev_mac %s\n\
  310. au_en_aec %s\n\
  311. au_en_anr %s\n\
  312. au_en_anr_out no\n\
  313. au_en_agc %s\n\
  314. agc_max_gain %s\n\
  315. agc_gate_threshold %s\n\
  316. au_en_cng %s\n\
  317. volume %s\n\
  318. end_beep %s\n\
  319. \n\
  320. #------------------------------------------------------------------------------\n\
  321. # Modules\n\
  322. \n\
  323. module_path /usr/lib/baresip/modules\n\
  324. \n\
  325. # UI Modules\n\
  326. module stdio.so\n\
  327. module cons.so\n\
  328. \n\
  329. # Audio codec Modules (in order)\n\
  330. module opus.so\n\
  331. module g722.so\n\
  332. module g711.so\n\
  333. \n\
  334. # Audio driver Modules\n\
  335. module alsa.so\n\
  336. \n\
  337. # Audio filter Modules\n\
  338. module aufile.so\n\
  339. module mixausrc.so\n\
  340. \n\
  341. # Media NAT modules\n\
  342. module stun.so\n\
  343. module turn.so\n\
  344. module ice.so\n\
  345. \n\
  346. #------------------------------------------------------------------------------\n\
  347. # Compatibility modules\n\
  348. \n\
  349. module uuid.so\n\
  350. \n\
  351. #------------------------------------------------------------------------------\n\
  352. # Application Modules\n\
  353. \n\
  354. module_app account.so\n\
  355. module_app auloop.so\n\
  356. module_app menu.so\n\
  357. module_app ctrl_tcp.so\n\
  358. module_app debug_cmd.so\n\
  359. module_app kaoptions.so\n\
  360. \n\
  361. #------------------------------------------------------------------------------\n\
  362. # Module parameters\n\
  363. \n\
  364. # UI Modules parameters\n\
  365. ctrl_tcp_listen 127.0.0.1:4444\n\
  366. cons_listen 127.0.0.1:5555\n\
  367. \n\
  368. # Opus codec parameters\n\
  369. opus_bitrate 128000\n\
  370. opus_stereo no\n\
  371. \n\
  372. ",\
  373. lport_line,\
  374. sec_call,\
  375. audio_src,\
  376. conf.startport,\
  377. conf.endport,\
  378. conf.jbufftype,\
  379. conf.rtptimeout,\
  380. conf.dev_type,\
  381. conf.version,\
  382. conf.mac,\
  383. conf.aec,\
  384. conf.anr,\
  385. conf.agc,\
  386. conf.agc_max_gain,\
  387. conf.agc_gate_threshold,\
  388. conf.cng,\
  389. conf.volume,\
  390. conf.end_beep
  391. );
  392. FILE *acc_conf_fp = fopen(ACC_CONF, "w+");
  393. if (acc_conf_fp == NULL){
  394. perror("Open accounts conf file Error: ");
  395. exit(1);
  396. }
  397. if(strcmp(conf.acc1.enable, "yes") == 0)
  398. {
  399. if(strcmp(conf.acc1.autoanswer, "yes") == 0)
  400. {
  401. strcpy(acc1_answermode, "auto");
  402. }
  403. else if(strcmp(conf.acc1.autoanswer, "no") == 0)
  404. {
  405. strcpy(acc1_answermode, "manual");
  406. }
  407. else
  408. {
  409. sprintf(acc1_answermode, "manual;answerdelay=%d", (int) (atof(conf.acc1.autoanswer)*1000));
  410. }
  411. memset(codecs, 0, sizeof(codecs));
  412. if(strcmp(conf.g722, "yes") == 0)
  413. {
  414. strcpy(codecs,"g722/16000/1");
  415. }
  416. if(strcmp(conf.alaw, "yes") == 0)
  417. {
  418. if(strlen(codecs))
  419. {
  420. strcat(codecs,",pcma");
  421. }
  422. else
  423. {
  424. strcpy(codecs,"pcma");
  425. }
  426. }
  427. if(strcmp(conf.ulaw, "yes") == 0)
  428. {
  429. if(strlen(codecs))
  430. {
  431. strcat(codecs,",pcmu");
  432. }
  433. else
  434. {
  435. strcpy(codecs,"pcmu");
  436. }
  437. }
  438. if(strcmp(conf.opus, "yes") == 0)
  439. {
  440. if(strlen(codecs))
  441. {
  442. strcat(codecs,",opus/48000/1");
  443. }
  444. else
  445. {
  446. strcpy(codecs,"opus/48000/1");
  447. }
  448. }
  449. if(strcmp(conf.g729, "yes") == 0)
  450. {
  451. if(strlen(codecs))
  452. {
  453. strcat(codecs,",g729");
  454. }
  455. else
  456. {
  457. strcpy(codecs,"g729");
  458. }
  459. }
  460. if(strcmp(conf.acc1.nat_mode, "stun") == 0)
  461. {
  462. sprintf(acc1_natstring, ";medianat=stun;stunserver=\"stun:%s:%s\"", conf.acc1.stun_server, conf.acc1.stun_port);
  463. }
  464. else if(strcmp(conf.acc1.nat_mode, "turn") == 0)
  465. {
  466. sprintf(acc1_natstring, ";medianat=turn;stunserver=\"turn:%s:%s\";stunuser=%s;stunpass=%s", conf.acc1.stun_server, conf.acc1.stun_port, conf.acc1.nat_username, conf.acc1.nat_password);
  467. }
  468. else if(strcmp(conf.acc1.nat_mode, "ice") == 0)
  469. {
  470. strcpy(acc1_natstring, ";medianat=ice");
  471. if(strlen(conf.acc1.stun_server) != 0)
  472. {
  473. if(strlen(conf.acc1.nat_username) != 0)
  474. {
  475. memset(nat_tmp,0,sizeof(nat_tmp));
  476. sprintf(nat_tmp, ";stunserver=\"turn:%s:%s\";stunuser=%s;stunpass=%s", conf.acc1.stun_server, conf.acc1.stun_port, conf.acc1.nat_username, conf.acc1.nat_password);
  477. strcat(acc1_natstring, nat_tmp);
  478. }
  479. else
  480. {
  481. memset(nat_tmp,0,sizeof(nat_tmp));
  482. sprintf(nat_tmp, ";stunserver=\"stun:%s:%s\"", conf.acc1.stun_server, conf.acc1.stun_port);
  483. strcat(acc1_natstring, nat_tmp);
  484. }
  485. }
  486. }
  487. if(strcmp(conf.acc1.keepalive, "yes") == 0)
  488. {
  489. sprintf(acc1_extrastring,";extra=kaoptions=%s",conf.acc1.ka_interval);
  490. }
  491. if(strlen(conf.acc1.domain) == 0)
  492. {
  493. strcpy(conf.acc1.domain,conf.acc1.server);
  494. }
  495. fprintf(acc_conf_fp, "\
  496. <sip:%s@%s>%s%s;auth_user=%s;auth_pass=%s;outbound=\"sip:%s:%s;transport=%s\";answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=%s;rwait=50;ringfile=%s\n\
  497. ",\
  498. conf.acc1.username,\
  499. conf.acc1.domain,\
  500. acc1_natstring,\
  501. acc1_extrastring,\
  502. conf.acc1.authuser,\
  503. conf.acc1.passwd,\
  504. conf.acc1.server,\
  505. conf.acc1.port,\
  506. conf.acc1.transport,\
  507. acc1_answermode,\
  508. conf.acc1.sip_autoanswer,\
  509. codecs,\
  510. conf.acc1.reg_expires,\
  511. conf.acc1.ringfile\
  512. );
  513. }
  514. if(strcmp(conf.acc2.enable, "yes") == 0)
  515. {
  516. if(strcmp(conf.acc2.autoanswer, "yes") == 0)
  517. {
  518. strcpy(acc2_answermode, "auto");
  519. }
  520. else if(strcmp(conf.acc2.autoanswer, "no") == 0)
  521. {
  522. strcpy(acc2_answermode, "manual");
  523. }
  524. else
  525. {
  526. sprintf(acc2_answermode, "manual;answerdelay=%d", (int) (atof(conf.acc2.autoanswer)*1000));
  527. }
  528. memset(codecs, 0, sizeof(codecs));
  529. if(strcmp(conf.g722, "yes") == 0)
  530. {
  531. strcpy(codecs,"g722/16000/1");
  532. }
  533. if(strcmp(conf.alaw, "yes") == 0)
  534. {
  535. if(strlen(codecs))
  536. {
  537. strcat(codecs,",pcma");
  538. }
  539. else
  540. {
  541. strcpy(codecs,"pcma");
  542. }
  543. }
  544. if(strcmp(conf.ulaw, "yes") == 0)
  545. {
  546. if(strlen(codecs))
  547. {
  548. strcat(codecs,",pcmu");
  549. }
  550. else
  551. {
  552. strcpy(codecs,"pcmu");
  553. }
  554. }
  555. if(strcmp(conf.opus, "yes") == 0)
  556. {
  557. if(strlen(codecs))
  558. {
  559. strcat(codecs,",opus/48000/1");
  560. }
  561. else
  562. {
  563. strcpy(codecs,"opus/48000/1");
  564. }
  565. }
  566. if(strcmp(conf.g729, "yes") == 0)
  567. {
  568. if(strlen(codecs))
  569. {
  570. strcat(codecs,",g729");
  571. }
  572. else
  573. {
  574. strcpy(codecs,"g729");
  575. }
  576. }
  577. if(strcmp(conf.acc2.nat_mode, "stun") == 0)
  578. {
  579. sprintf(acc2_natstring, ";medianat=stun;stunserver=\"stun:%s:%s\"", conf.acc2.stun_server, conf.acc2.stun_port);
  580. }
  581. else if(strcmp(conf.acc2.nat_mode, "turn") == 0)
  582. {
  583. sprintf(acc2_natstring, ";medianat=turn;stunserver=\"turn:%s:%s\";stunuser=%s;stunpass=%s", conf.acc2.stun_server, conf.acc2.stun_port, conf.acc2.nat_username, conf.acc2.nat_password);
  584. }
  585. else if(strcmp(conf.acc2.nat_mode, "ice") == 0)
  586. {
  587. strcpy(acc2_natstring, ";medianat=ice");
  588. if(strlen(conf.acc2.stun_server) != 0)
  589. {
  590. if(strlen(conf.acc2.nat_username) != 0)
  591. {
  592. memset(nat_tmp,0,sizeof(nat_tmp));
  593. sprintf(nat_tmp, ";stunserver=\"turn:%s:%s\";stunuser=%s;stunpass=%s", conf.acc2.stun_server, conf.acc2.stun_port, conf.acc2.nat_username, conf.acc2.nat_password);
  594. strcat(acc2_natstring, nat_tmp);
  595. }
  596. else
  597. {
  598. memset(nat_tmp,0,sizeof(nat_tmp));
  599. sprintf(nat_tmp, ";stunserver=\"stun:%s:%s\"", conf.acc2.stun_server, conf.acc2.stun_port);
  600. strcat(acc2_natstring, nat_tmp);
  601. }
  602. }
  603. }
  604. if(strcmp(conf.acc2.keepalive, "yes") == 0)
  605. {
  606. sprintf(acc2_extrastring,";extra=kaoptions=%s",conf.acc2.ka_interval);
  607. }
  608. if(strlen(conf.acc2.domain) == 0)
  609. {
  610. strcpy(conf.acc2.domain,conf.acc2.server);
  611. }
  612. fprintf(acc_conf_fp, "\
  613. <sip:%s@%s>%s%s;auth_user=%s;auth_pass=%s;outbound=\"sip:%s:%s;transport=%s\";answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=%s;rwait=50;ringfile=%s\n\
  614. ",\
  615. conf.acc2.username,\
  616. conf.acc2.domain,\
  617. acc2_natstring,\
  618. acc2_extrastring,\
  619. conf.acc2.authuser,\
  620. conf.acc2.passwd,\
  621. conf.acc2.server,\
  622. conf.acc2.port,\
  623. conf.acc2.transport,\
  624. acc2_answermode,\
  625. conf.acc2.sip_autoanswer,\
  626. codecs,\
  627. conf.acc2.reg_expires,\
  628. conf.acc2.ringfile\
  629. );
  630. }
  631. if(strcmp(conf.acc3.enable, "yes") == 0)
  632. {
  633. if(strcmp(conf.acc3.autoanswer, "yes") == 0)
  634. {
  635. strcpy(acc3_answermode, "auto");
  636. }
  637. else if(strcmp(conf.acc3.autoanswer, "no") == 0)
  638. {
  639. strcpy(acc3_answermode, "manual");
  640. }
  641. else
  642. {
  643. sprintf(acc3_answermode, "manual;answerdelay=%d", (int) (atof(conf.acc3.autoanswer)*1000));
  644. }
  645. memset(codecs, 0, sizeof(codecs));
  646. if(strcmp(conf.g722, "yes") == 0)
  647. {
  648. strcpy(codecs,"g722/16000/1");
  649. }
  650. if(strcmp(conf.alaw, "yes") == 0)
  651. {
  652. if(strlen(codecs))
  653. {
  654. strcat(codecs,",pcma");
  655. }
  656. else
  657. {
  658. strcpy(codecs,"pcma");
  659. }
  660. }
  661. if(strcmp(conf.ulaw, "yes") == 0)
  662. {
  663. if(strlen(codecs))
  664. {
  665. strcat(codecs,",pcmu");
  666. }
  667. else
  668. {
  669. strcpy(codecs,"pcmu");
  670. }
  671. }
  672. if(strcmp(conf.opus, "yes") == 0)
  673. {
  674. if(strlen(codecs))
  675. {
  676. strcat(codecs,",opus/48000/1");
  677. }
  678. else
  679. {
  680. strcpy(codecs,"opus/48000/1");
  681. }
  682. }
  683. if(strcmp(conf.g729, "yes") == 0)
  684. {
  685. if(strlen(codecs))
  686. {
  687. strcat(codecs,",g729");
  688. }
  689. else
  690. {
  691. strcpy(codecs,"g729");
  692. }
  693. }
  694. if(strcmp(conf.acc3.nat_mode, "stun") == 0)
  695. {
  696. sprintf(acc3_natstring, ";medianat=stun;stunserver=\"stun:%s:%s\"", conf.acc3.stun_server, conf.acc3.stun_port);
  697. }
  698. else if(strcmp(conf.acc3.nat_mode, "turn") == 0)
  699. {
  700. sprintf(acc3_natstring, ";medianat=turn;stunserver=\"turn:%s:%s\";stunuser=%s;stunpass=%s", conf.acc3.stun_server, conf.acc3.stun_port, conf.acc3.nat_username, conf.acc3.nat_password);
  701. }
  702. else if(strcmp(conf.acc3.nat_mode, "ice") == 0)
  703. {
  704. strcpy(acc3_natstring, ";medianat=ice");
  705. if(strlen(conf.acc3.stun_server) != 0)
  706. {
  707. if(strlen(conf.acc3.nat_username) != 0)
  708. {
  709. memset(nat_tmp,0,sizeof(nat_tmp));
  710. sprintf(nat_tmp, ";stunserver=\"turn:%s:%s\";stunuser=%s;stunpass=%s", conf.acc3.stun_server, conf.acc3.stun_port, conf.acc3.nat_username, conf.acc3.nat_password);
  711. strcat(acc3_natstring, nat_tmp);
  712. }
  713. else
  714. {
  715. memset(nat_tmp,0,sizeof(nat_tmp));
  716. sprintf(nat_tmp, ";stunserver=\"stun:%s:%s\"", conf.acc3.stun_server, conf.acc3.stun_port);
  717. strcat(acc3_natstring, nat_tmp);
  718. }
  719. }
  720. }
  721. if(strcmp(conf.acc3.keepalive, "yes") == 0)
  722. {
  723. sprintf(acc3_extrastring,";extra=kaoptions=%s",conf.acc3.ka_interval);
  724. }
  725. if(strlen(conf.acc3.domain) == 0)
  726. {
  727. strcpy(conf.acc3.domain,conf.acc3.server);
  728. }
  729. fprintf(acc_conf_fp, "\
  730. <sip:%s@%s>%s%s;auth_user=%s;auth_pass=%s;outbound=\"sip:%s:%s;transport=%s\";answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=%s;rwait=50;ringfile=%s\n\
  731. ",\
  732. conf.acc3.username,\
  733. conf.acc3.domain,\
  734. acc3_natstring,\
  735. acc3_extrastring,\
  736. conf.acc3.authuser,\
  737. conf.acc3.passwd,\
  738. conf.acc3.server,\
  739. conf.acc3.port,\
  740. conf.acc3.transport,\
  741. acc3_answermode,\
  742. conf.acc3.sip_autoanswer,\
  743. codecs,\
  744. conf.acc3.reg_expires,\
  745. conf.acc3.ringfile\
  746. );
  747. }
  748. if(strcmp(conf.p2p.enable, "yes") == 0)
  749. {
  750. if(strcmp(conf.p2p.autoanswer, "yes") == 0)
  751. {
  752. strcpy(p2p_answermode, "auto");
  753. }
  754. else if(strcmp(conf.p2p.autoanswer, "no") == 0)
  755. {
  756. strcpy(p2p_answermode, "manual");
  757. }
  758. else
  759. {
  760. sprintf(p2p_answermode, "manual;answerdelay=%d", (int) (atof(conf.p2p.autoanswer)*1000));
  761. }
  762. memset(codecs, 0, sizeof(codecs));
  763. if(strcmp(conf.g722, "yes") == 0)
  764. {
  765. strcpy(codecs,"g722/16000/1");
  766. }
  767. if(strcmp(conf.alaw, "yes") == 0)
  768. {
  769. if(strlen(codecs))
  770. {
  771. strcat(codecs,",pcma");
  772. }
  773. else
  774. {
  775. strcpy(codecs,"pcma");
  776. }
  777. }
  778. if(strcmp(conf.ulaw, "yes") == 0)
  779. {
  780. if(strlen(codecs))
  781. {
  782. strcat(codecs,",pcmu");
  783. }
  784. else
  785. {
  786. strcpy(codecs,"pcmu");
  787. }
  788. }
  789. if(strcmp(conf.opus, "yes") == 0)
  790. {
  791. if(strlen(codecs))
  792. {
  793. strcat(codecs,",opus/48000/1");
  794. }
  795. else
  796. {
  797. strcpy(codecs,"opus/48000/1");
  798. }
  799. }
  800. if(strcmp(conf.g729, "yes") == 0)
  801. {
  802. if(strlen(codecs))
  803. {
  804. strcat(codecs,",g729");
  805. }
  806. else
  807. {
  808. strcpy(codecs,"g729");
  809. }
  810. }
  811. GetCmdValue("/sbin/ifconfig eth0 | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1", localip, sizeof(localip));
  812. if(strlen(localip) == 0)
  813. {
  814. memset(localip, 0, sizeof(localip));
  815. strcpy(localip,"127.0.0.1");
  816. }
  817. else
  818. {
  819. localip[strlen(localip) - 1] = '\0';
  820. }
  821. if(strcmp(conf.p2p.auth,"yes") == 0)
  822. fprintf(acc_conf_fp, "\
  823. <sip:%s@%s:%s;transport=%s>;answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=0;ringfile=%s\n\
  824. ",\
  825. conf.p2p.username,\
  826. localip,\
  827. conf.localport,\
  828. conf.p2p.transport,\
  829. p2p_answermode,\
  830. conf.p2p.sip_autoanswer,\
  831. codecs,\
  832. conf.p2p.ringfile\
  833. );
  834. else
  835. fprintf(acc_conf_fp, "\
  836. <sip:%s:%s;transport=%s>;answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=0;ringfile=%s\n\
  837. ",\
  838. localip,\
  839. conf.localport,\
  840. conf.p2p.transport,\
  841. p2p_answermode,\
  842. conf.p2p.sip_autoanswer,\
  843. codecs,\
  844. conf.p2p.ringfile\
  845. );
  846. }
  847. fclose(phone_modules_fp);
  848. fclose(acc_conf_fp);
  849. }