main.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "iniparser/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,plug:mixmic"
  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 2\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. module auresamp.so\n\
  341. \n\
  342. # Media NAT modules\n\
  343. module stun.so\n\
  344. module turn.so\n\
  345. module ice.so\n\
  346. \n\
  347. #------------------------------------------------------------------------------\n\
  348. # Compatibility modules\n\
  349. \n\
  350. module uuid.so\n\
  351. \n\
  352. #------------------------------------------------------------------------------\n\
  353. # Application Modules\n\
  354. \n\
  355. module_app account.so\n\
  356. module_app auloop.so\n\
  357. module_app menu.so\n\
  358. module_app ctrl_tcp.so\n\
  359. module_app debug_cmd.so\n\
  360. module_app kaoptions.so\n\
  361. \n\
  362. #------------------------------------------------------------------------------\n\
  363. # Module parameters\n\
  364. \n\
  365. # UI Modules parameters\n\
  366. ctrl_tcp_listen 127.0.0.1:4444\n\
  367. cons_listen 127.0.0.1:5555\n\
  368. \n\
  369. # Opus codec parameters\n\
  370. opus_bitrate 128000\n\
  371. opus_stereo no\n\
  372. \n\
  373. ",\
  374. lport_line,\
  375. sec_call,\
  376. audio_src,\
  377. conf.startport,\
  378. conf.endport,\
  379. conf.jbufftype,\
  380. conf.rtptimeout,\
  381. conf.dev_type,\
  382. conf.version,\
  383. conf.mac,\
  384. conf.aec,\
  385. conf.anr,\
  386. conf.agc,\
  387. conf.agc_max_gain,\
  388. conf.agc_gate_threshold,\
  389. conf.cng,\
  390. conf.volume,\
  391. conf.end_beep
  392. );
  393. FILE *acc_conf_fp = fopen(ACC_CONF, "w+");
  394. if (acc_conf_fp == NULL){
  395. perror("Open accounts conf file Error: ");
  396. exit(1);
  397. }
  398. if(strcmp(conf.acc1.enable, "yes") == 0)
  399. {
  400. if(strcmp(conf.acc1.autoanswer, "yes") == 0)
  401. {
  402. strcpy(acc1_answermode, "auto");
  403. }
  404. else if(strcmp(conf.acc1.autoanswer, "no") == 0)
  405. {
  406. strcpy(acc1_answermode, "manual");
  407. }
  408. else
  409. {
  410. sprintf(acc1_answermode, "manual;answerdelay=%d", (int) (atof(conf.acc1.autoanswer)*1000));
  411. }
  412. memset(codecs, 0, sizeof(codecs));
  413. if(strcmp(conf.g722, "yes") == 0)
  414. {
  415. strcpy(codecs,"g722/16000/1");
  416. }
  417. if(strcmp(conf.alaw, "yes") == 0)
  418. {
  419. if(strlen(codecs))
  420. {
  421. strcat(codecs,",pcma");
  422. }
  423. else
  424. {
  425. strcpy(codecs,"pcma");
  426. }
  427. }
  428. if(strcmp(conf.ulaw, "yes") == 0)
  429. {
  430. if(strlen(codecs))
  431. {
  432. strcat(codecs,",pcmu");
  433. }
  434. else
  435. {
  436. strcpy(codecs,"pcmu");
  437. }
  438. }
  439. if(strcmp(conf.opus, "yes") == 0)
  440. {
  441. if(strlen(codecs))
  442. {
  443. strcat(codecs,",opus/48000/1");
  444. }
  445. else
  446. {
  447. strcpy(codecs,"opus/48000/1");
  448. }
  449. }
  450. if(strcmp(conf.g729, "yes") == 0)
  451. {
  452. if(strlen(codecs))
  453. {
  454. strcat(codecs,",g729");
  455. }
  456. else
  457. {
  458. strcpy(codecs,"g729");
  459. }
  460. }
  461. if(strcmp(conf.acc1.nat_mode, "stun") == 0)
  462. {
  463. sprintf(acc1_natstring, ";medianat=stun;stunserver=\"stun:%s:%s\"", conf.acc1.stun_server, conf.acc1.stun_port);
  464. }
  465. else if(strcmp(conf.acc1.nat_mode, "turn") == 0)
  466. {
  467. 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);
  468. }
  469. else if(strcmp(conf.acc1.nat_mode, "ice") == 0)
  470. {
  471. strcpy(acc1_natstring, ";medianat=ice");
  472. if(strlen(conf.acc1.stun_server) != 0)
  473. {
  474. if(strlen(conf.acc1.nat_username) != 0)
  475. {
  476. memset(nat_tmp,0,sizeof(nat_tmp));
  477. 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);
  478. strcat(acc1_natstring, nat_tmp);
  479. }
  480. else
  481. {
  482. memset(nat_tmp,0,sizeof(nat_tmp));
  483. sprintf(nat_tmp, ";stunserver=\"stun:%s:%s\"", conf.acc1.stun_server, conf.acc1.stun_port);
  484. strcat(acc1_natstring, nat_tmp);
  485. }
  486. }
  487. }
  488. if(strcmp(conf.acc1.keepalive, "yes") == 0)
  489. {
  490. sprintf(acc1_extrastring,";extra=kaoptions=%s",conf.acc1.ka_interval);
  491. }
  492. if(strlen(conf.acc1.domain) == 0)
  493. {
  494. strcpy(conf.acc1.domain,conf.acc1.server);
  495. }
  496. fprintf(acc_conf_fp, "\
  497. <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\
  498. ",\
  499. conf.acc1.username,\
  500. conf.acc1.domain,\
  501. acc1_natstring,\
  502. acc1_extrastring,\
  503. conf.acc1.authuser,\
  504. conf.acc1.passwd,\
  505. conf.acc1.server,\
  506. conf.acc1.port,\
  507. conf.acc1.transport,\
  508. acc1_answermode,\
  509. conf.acc1.sip_autoanswer,\
  510. codecs,\
  511. conf.acc1.reg_expires,\
  512. conf.acc1.ringfile\
  513. );
  514. }
  515. if(strcmp(conf.acc2.enable, "yes") == 0)
  516. {
  517. if(strcmp(conf.acc2.autoanswer, "yes") == 0)
  518. {
  519. strcpy(acc2_answermode, "auto");
  520. }
  521. else if(strcmp(conf.acc2.autoanswer, "no") == 0)
  522. {
  523. strcpy(acc2_answermode, "manual");
  524. }
  525. else
  526. {
  527. sprintf(acc2_answermode, "manual;answerdelay=%d", (int) (atof(conf.acc2.autoanswer)*1000));
  528. }
  529. memset(codecs, 0, sizeof(codecs));
  530. if(strcmp(conf.g722, "yes") == 0)
  531. {
  532. strcpy(codecs,"g722/16000/1");
  533. }
  534. if(strcmp(conf.alaw, "yes") == 0)
  535. {
  536. if(strlen(codecs))
  537. {
  538. strcat(codecs,",pcma");
  539. }
  540. else
  541. {
  542. strcpy(codecs,"pcma");
  543. }
  544. }
  545. if(strcmp(conf.ulaw, "yes") == 0)
  546. {
  547. if(strlen(codecs))
  548. {
  549. strcat(codecs,",pcmu");
  550. }
  551. else
  552. {
  553. strcpy(codecs,"pcmu");
  554. }
  555. }
  556. if(strcmp(conf.opus, "yes") == 0)
  557. {
  558. if(strlen(codecs))
  559. {
  560. strcat(codecs,",opus/48000/1");
  561. }
  562. else
  563. {
  564. strcpy(codecs,"opus/48000/1");
  565. }
  566. }
  567. if(strcmp(conf.g729, "yes") == 0)
  568. {
  569. if(strlen(codecs))
  570. {
  571. strcat(codecs,",g729");
  572. }
  573. else
  574. {
  575. strcpy(codecs,"g729");
  576. }
  577. }
  578. if(strcmp(conf.acc2.nat_mode, "stun") == 0)
  579. {
  580. sprintf(acc2_natstring, ";medianat=stun;stunserver=\"stun:%s:%s\"", conf.acc2.stun_server, conf.acc2.stun_port);
  581. }
  582. else if(strcmp(conf.acc2.nat_mode, "turn") == 0)
  583. {
  584. 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);
  585. }
  586. else if(strcmp(conf.acc2.nat_mode, "ice") == 0)
  587. {
  588. strcpy(acc2_natstring, ";medianat=ice");
  589. if(strlen(conf.acc2.stun_server) != 0)
  590. {
  591. if(strlen(conf.acc2.nat_username) != 0)
  592. {
  593. memset(nat_tmp,0,sizeof(nat_tmp));
  594. 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);
  595. strcat(acc2_natstring, nat_tmp);
  596. }
  597. else
  598. {
  599. memset(nat_tmp,0,sizeof(nat_tmp));
  600. sprintf(nat_tmp, ";stunserver=\"stun:%s:%s\"", conf.acc2.stun_server, conf.acc2.stun_port);
  601. strcat(acc2_natstring, nat_tmp);
  602. }
  603. }
  604. }
  605. if(strcmp(conf.acc2.keepalive, "yes") == 0)
  606. {
  607. sprintf(acc2_extrastring,";extra=kaoptions=%s",conf.acc2.ka_interval);
  608. }
  609. if(strlen(conf.acc2.domain) == 0)
  610. {
  611. strcpy(conf.acc2.domain,conf.acc2.server);
  612. }
  613. fprintf(acc_conf_fp, "\
  614. <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\
  615. ",\
  616. conf.acc2.username,\
  617. conf.acc2.domain,\
  618. acc2_natstring,\
  619. acc2_extrastring,\
  620. conf.acc2.authuser,\
  621. conf.acc2.passwd,\
  622. conf.acc2.server,\
  623. conf.acc2.port,\
  624. conf.acc2.transport,\
  625. acc2_answermode,\
  626. conf.acc2.sip_autoanswer,\
  627. codecs,\
  628. conf.acc2.reg_expires,\
  629. conf.acc2.ringfile\
  630. );
  631. }
  632. if(strcmp(conf.acc3.enable, "yes") == 0)
  633. {
  634. if(strcmp(conf.acc3.autoanswer, "yes") == 0)
  635. {
  636. strcpy(acc3_answermode, "auto");
  637. }
  638. else if(strcmp(conf.acc3.autoanswer, "no") == 0)
  639. {
  640. strcpy(acc3_answermode, "manual");
  641. }
  642. else
  643. {
  644. sprintf(acc3_answermode, "manual;answerdelay=%d", (int) (atof(conf.acc3.autoanswer)*1000));
  645. }
  646. memset(codecs, 0, sizeof(codecs));
  647. if(strcmp(conf.g722, "yes") == 0)
  648. {
  649. strcpy(codecs,"g722/16000/1");
  650. }
  651. if(strcmp(conf.alaw, "yes") == 0)
  652. {
  653. if(strlen(codecs))
  654. {
  655. strcat(codecs,",pcma");
  656. }
  657. else
  658. {
  659. strcpy(codecs,"pcma");
  660. }
  661. }
  662. if(strcmp(conf.ulaw, "yes") == 0)
  663. {
  664. if(strlen(codecs))
  665. {
  666. strcat(codecs,",pcmu");
  667. }
  668. else
  669. {
  670. strcpy(codecs,"pcmu");
  671. }
  672. }
  673. if(strcmp(conf.opus, "yes") == 0)
  674. {
  675. if(strlen(codecs))
  676. {
  677. strcat(codecs,",opus/48000/1");
  678. }
  679. else
  680. {
  681. strcpy(codecs,"opus/48000/1");
  682. }
  683. }
  684. if(strcmp(conf.g729, "yes") == 0)
  685. {
  686. if(strlen(codecs))
  687. {
  688. strcat(codecs,",g729");
  689. }
  690. else
  691. {
  692. strcpy(codecs,"g729");
  693. }
  694. }
  695. if(strcmp(conf.acc3.nat_mode, "stun") == 0)
  696. {
  697. sprintf(acc3_natstring, ";medianat=stun;stunserver=\"stun:%s:%s\"", conf.acc3.stun_server, conf.acc3.stun_port);
  698. }
  699. else if(strcmp(conf.acc3.nat_mode, "turn") == 0)
  700. {
  701. 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);
  702. }
  703. else if(strcmp(conf.acc3.nat_mode, "ice") == 0)
  704. {
  705. strcpy(acc3_natstring, ";medianat=ice");
  706. if(strlen(conf.acc3.stun_server) != 0)
  707. {
  708. if(strlen(conf.acc3.nat_username) != 0)
  709. {
  710. memset(nat_tmp,0,sizeof(nat_tmp));
  711. 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);
  712. strcat(acc3_natstring, nat_tmp);
  713. }
  714. else
  715. {
  716. memset(nat_tmp,0,sizeof(nat_tmp));
  717. sprintf(nat_tmp, ";stunserver=\"stun:%s:%s\"", conf.acc3.stun_server, conf.acc3.stun_port);
  718. strcat(acc3_natstring, nat_tmp);
  719. }
  720. }
  721. }
  722. if(strcmp(conf.acc3.keepalive, "yes") == 0)
  723. {
  724. sprintf(acc3_extrastring,";extra=kaoptions=%s",conf.acc3.ka_interval);
  725. }
  726. if(strlen(conf.acc3.domain) == 0)
  727. {
  728. strcpy(conf.acc3.domain,conf.acc3.server);
  729. }
  730. fprintf(acc_conf_fp, "\
  731. <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\
  732. ",\
  733. conf.acc3.username,\
  734. conf.acc3.domain,\
  735. acc3_natstring,\
  736. acc3_extrastring,\
  737. conf.acc3.authuser,\
  738. conf.acc3.passwd,\
  739. conf.acc3.server,\
  740. conf.acc3.port,\
  741. conf.acc3.transport,\
  742. acc3_answermode,\
  743. conf.acc3.sip_autoanswer,\
  744. codecs,\
  745. conf.acc3.reg_expires,\
  746. conf.acc3.ringfile\
  747. );
  748. }
  749. if(strcmp(conf.p2p.enable, "yes") == 0)
  750. {
  751. if(strcmp(conf.p2p.autoanswer, "yes") == 0)
  752. {
  753. strcpy(p2p_answermode, "auto");
  754. }
  755. else if(strcmp(conf.p2p.autoanswer, "no") == 0)
  756. {
  757. strcpy(p2p_answermode, "manual");
  758. }
  759. else
  760. {
  761. sprintf(p2p_answermode, "manual;answerdelay=%d", (int) (atof(conf.p2p.autoanswer)*1000));
  762. }
  763. memset(codecs, 0, sizeof(codecs));
  764. if(strcmp(conf.g722, "yes") == 0)
  765. {
  766. strcpy(codecs,"g722/16000/1");
  767. }
  768. if(strcmp(conf.alaw, "yes") == 0)
  769. {
  770. if(strlen(codecs))
  771. {
  772. strcat(codecs,",pcma");
  773. }
  774. else
  775. {
  776. strcpy(codecs,"pcma");
  777. }
  778. }
  779. if(strcmp(conf.ulaw, "yes") == 0)
  780. {
  781. if(strlen(codecs))
  782. {
  783. strcat(codecs,",pcmu");
  784. }
  785. else
  786. {
  787. strcpy(codecs,"pcmu");
  788. }
  789. }
  790. if(strcmp(conf.opus, "yes") == 0)
  791. {
  792. if(strlen(codecs))
  793. {
  794. strcat(codecs,",opus/48000/1");
  795. }
  796. else
  797. {
  798. strcpy(codecs,"opus/48000/1");
  799. }
  800. }
  801. if(strcmp(conf.g729, "yes") == 0)
  802. {
  803. if(strlen(codecs))
  804. {
  805. strcat(codecs,",g729");
  806. }
  807. else
  808. {
  809. strcpy(codecs,"g729");
  810. }
  811. }
  812. GetCmdValue("/sbin/ifconfig eth0 | grep 'inet addr' | cut -d':' -f2 | cut -d' ' -f1", localip, sizeof(localip));
  813. if(strlen(localip) == 0)
  814. {
  815. memset(localip, 0, sizeof(localip));
  816. strcpy(localip,"127.0.0.1");
  817. }
  818. else
  819. {
  820. localip[strlen(localip) - 1] = '\0';
  821. }
  822. if(strcmp(conf.p2p.auth,"yes") == 0)
  823. fprintf(acc_conf_fp, "\
  824. <sip:%s@%s:%s;transport=%s>;answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=0;ringfile=%s\n\
  825. ",\
  826. conf.p2p.username,\
  827. localip,\
  828. conf.localport,\
  829. conf.p2p.transport,\
  830. p2p_answermode,\
  831. conf.p2p.sip_autoanswer,\
  832. codecs,\
  833. conf.p2p.ringfile\
  834. );
  835. else
  836. fprintf(acc_conf_fp, "\
  837. <sip:%s:%s;transport=%s>;answermode=%s;sip_autoanswer=%s;audio_codecs=%s;regint=0;ringfile=%s\n\
  838. ",\
  839. localip,\
  840. conf.localport,\
  841. conf.p2p.transport,\
  842. p2p_answermode,\
  843. conf.p2p.sip_autoanswer,\
  844. codecs,\
  845. conf.p2p.ringfile\
  846. );
  847. }
  848. fclose(phone_modules_fp);
  849. fclose(acc_conf_fp);
  850. }