mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-11-03 20:38:59 +00:00 
			
		
		
		
	Compare commits
	
		
			468 Commits
		
	
	
		
			certified/
			...
			1.0.12
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					6fa9cd9521 | ||
| 
						 | 
					c6363dc1d7 | ||
| 
						 | 
					0bd9a22495 | ||
| 
						 | 
					63046de1cb | ||
| 
						 | 
					e132aba5c9 | ||
| 
						 | 
					4196243583 | ||
| 
						 | 
					9ce061aa3f | ||
| 
						 | 
					168ed954eb | ||
| 
						 | 
					0d1660a369 | ||
| 
						 | 
					ebb8253d2f | ||
| 
						 | 
					11f81ad761 | ||
| 
						 | 
					ad8786f355 | ||
| 
						 | 
					17fd431b31 | ||
| 
						 | 
					45c9175c77 | ||
| 
						 | 
					8355d829bb | ||
| 
						 | 
					b14b81d8b4 | ||
| 
						 | 
					e875a17b48 | ||
| 
						 | 
					7f9f2f6543 | ||
| 
						 | 
					b2cfc35315 | ||
| 
						 | 
					31c57904fd | ||
| 
						 | 
					0ead801f25 | ||
| 
						 | 
					009b812d76 | ||
| 
						 | 
					a0d4959fc5 | ||
| 
						 | 
					11c11d27bc | ||
| 
						 | 
					6b36952664 | ||
| 
						 | 
					afdd1c5512 | ||
| 
						 | 
					ac303de4aa | ||
| 
						 | 
					508b3ba688 | ||
| 
						 | 
					75b0c4445a | ||
| 
						 | 
					2f5ced421e | ||
| 
						 | 
					d09714e12b | ||
| 
						 | 
					52171d4c26 | ||
| 
						 | 
					8bd93a96ac | ||
| 
						 | 
					5a80b57ccf | ||
| 
						 | 
					b2fb3d501c | ||
| 
						 | 
					6cf8ee01a6 | ||
| 
						 | 
					153119a7bc | ||
| 
						 | 
					9b8ba163f2 | ||
| 
						 | 
					bfac0241be | ||
| 
						 | 
					09f5f15a72 | ||
| 
						 | 
					84957104b2 | ||
| 
						 | 
					312008513e | ||
| 
						 | 
					08630905fa | ||
| 
						 | 
					83ef83a5f8 | ||
| 
						 | 
					2595998b8f | ||
| 
						 | 
					7fe4d52579 | ||
| 
						 | 
					39d4e1253b | ||
| 
						 | 
					f7eada3cff | ||
| 
						 | 
					405ff91e92 | ||
| 
						 | 
					ce07ed72c0 | ||
| 
						 | 
					150fc177cd | ||
| 
						 | 
					c73ad9e6f9 | ||
| 
						 | 
					cf638de6ad | ||
| 
						 | 
					40ea953811 | ||
| 
						 | 
					8061ba32c3 | ||
| 
						 | 
					120e4bc237 | ||
| 
						 | 
					4fc7030156 | ||
| 
						 | 
					34d2254f70 | ||
| 
						 | 
					b47ed67c84 | ||
| 
						 | 
					e6f049f9bf | ||
| 
						 | 
					7491dba549 | ||
| 
						 | 
					3e7d040f3f | ||
| 
						 | 
					c78761cc7c | ||
| 
						 | 
					6b6eb7977b | ||
| 
						 | 
					a795d02a30 | ||
| 
						 | 
					2faf30d730 | ||
| 
						 | 
					c2a39b5c64 | ||
| 
						 | 
					ffc2c34f15 | ||
| 
						 | 
					57cb8c168c | ||
| 
						 | 
					f1274662f4 | ||
| 
						 | 
					9f6e57f90a | ||
| 
						 | 
					8ff6d5cabf | ||
| 
						 | 
					298718ebaa | ||
| 
						 | 
					171872003b | ||
| 
						 | 
					5fe5bf08b2 | ||
| 
						 | 
					cf238fa10d | ||
| 
						 | 
					7e3d58e030 | ||
| 
						 | 
					508b530e39 | ||
| 
						 | 
					5e168ffd67 | ||
| 
						 | 
					9e05fb4f39 | ||
| 
						 | 
					a2c28355e0 | ||
| 
						 | 
					0e4c9f9765 | ||
| 
						 | 
					4d504015d4 | ||
| 
						 | 
					3e2bd82411 | ||
| 
						 | 
					2877470389 | ||
| 
						 | 
					4a15544b22 | ||
| 
						 | 
					9400e87db0 | ||
| 
						 | 
					200ca9631d | ||
| 
						 | 
					4f1e96c0b6 | ||
| 
						 | 
					eac2ef9374 | ||
| 
						 | 
					dd70231e97 | ||
| 
						 | 
					02bb0b5e22 | ||
| 
						 | 
					f14775e845 | ||
| 
						 | 
					ee90d54c2e | ||
| 
						 | 
					f4c2a167ed | ||
| 
						 | 
					0ad6773b76 | ||
| 
						 | 
					320be7fff9 | ||
| 
						 | 
					0c2abdf74e | ||
| 
						 | 
					0b3cfb26b4 | ||
| 
						 | 
					cbc30c9163 | ||
| 
						 | 
					71a395e3e3 | ||
| 
						 | 
					b2073cb75f | ||
| 
						 | 
					df905cf5a2 | ||
| 
						 | 
					cf45c660cc | ||
| 
						 | 
					2995096956 | ||
| 
						 | 
					a6e8158ddc | ||
| 
						 | 
					68206d0890 | ||
| 
						 | 
					6dbcb94c01 | ||
| 
						 | 
					91f9740856 | ||
| 
						 | 
					083cf7af1d | ||
| 
						 | 
					984142aebe | ||
| 
						 | 
					29f7161c9b | ||
| 
						 | 
					6618cec0d7 | ||
| 
						 | 
					ebe377fc5c | ||
| 
						 | 
					268eedc2f3 | ||
| 
						 | 
					eadb02a84f | ||
| 
						 | 
					c98832d092 | ||
| 
						 | 
					888c329e65 | ||
| 
						 | 
					548ce34d97 | ||
| 
						 | 
					2e4b4764fb | ||
| 
						 | 
					bf1069b3ae | ||
| 
						 | 
					f717cd2719 | ||
| 
						 | 
					cda604fabe | ||
| 
						 | 
					6125965ff5 | ||
| 
						 | 
					a6cea6892b | ||
| 
						 | 
					1031a3c36d | ||
| 
						 | 
					89d62574ef | ||
| 
						 | 
					262e9c3003 | ||
| 
						 | 
					43e32456ca | ||
| 
						 | 
					fcb8ab5da6 | ||
| 
						 | 
					0f5dbaf7ec | ||
| 
						 | 
					8e267ac60a | ||
| 
						 | 
					794d0b2c68 | ||
| 
						 | 
					8c97879e99 | ||
| 
						 | 
					47f2779b9d | ||
| 
						 | 
					c77e7ed452 | ||
| 
						 | 
					a9fd6fca9e | ||
| 
						 | 
					57b353cebf | ||
| 
						 | 
					07c87b82ff | ||
| 
						 | 
					f1c3d761aa | ||
| 
						 | 
					34f9e85a11 | ||
| 
						 | 
					56cf655835 | ||
| 
						 | 
					4d1e5adfdc | ||
| 
						 | 
					3d263c243a | ||
| 
						 | 
					334e508e66 | ||
| 
						 | 
					28eedd8e44 | ||
| 
						 | 
					e0aaf08b3b | ||
| 
						 | 
					e16718bb2e | ||
| 
						 | 
					1e70fa09cd | ||
| 
						 | 
					a2f752ec6c | ||
| 
						 | 
					3ad71d439c | ||
| 
						 | 
					d667d39367 | ||
| 
						 | 
					c96d5eabad | ||
| 
						 | 
					941ba1c5be | ||
| 
						 | 
					17045b502f | ||
| 
						 | 
					916f6b627a | ||
| 
						 | 
					e56c7ba459 | ||
| 
						 | 
					34bc1ac241 | ||
| 
						 | 
					4920426fbd | ||
| 
						 | 
					e5f2fef425 | ||
| 
						 | 
					4faec1b262 | ||
| 
						 | 
					efc4fdf079 | ||
| 
						 | 
					8b6aa2741c | ||
| 
						 | 
					90fea452ac | ||
| 
						 | 
					8451fd7f7d | ||
| 
						 | 
					ed8a15efce | ||
| 
						 | 
					6bee09440d | ||
| 
						 | 
					d54b330a2e | ||
| 
						 | 
					621b5be6cd | ||
| 
						 | 
					687846975e | ||
| 
						 | 
					315e0c3054 | ||
| 
						 | 
					4f4009663c | ||
| 
						 | 
					48f1386fff | ||
| 
						 | 
					8f0e43be23 | ||
| 
						 | 
					4b165caef4 | ||
| 
						 | 
					4a14b7c071 | ||
| 
						 | 
					e12e134ef9 | ||
| 
						 | 
					7b319eb03a | ||
| 
						 | 
					98d05f22ac | ||
| 
						 | 
					7ba20c5024 | ||
| 
						 | 
					2e6d346313 | ||
| 
						 | 
					8aaa9e194e | ||
| 
						 | 
					60a9627192 | ||
| 
						 | 
					28a319be01 | ||
| 
						 | 
					f066af663f | ||
| 
						 | 
					1e2baaf12e | ||
| 
						 | 
					f56ba6a441 | ||
| 
						 | 
					2ea44416b2 | ||
| 
						 | 
					78f6f43d19 | ||
| 
						 | 
					42b84afa40 | ||
| 
						 | 
					be446083ab | ||
| 
						 | 
					61538bec92 | ||
| 
						 | 
					4402a86f93 | ||
| 
						 | 
					4ead78e851 | ||
| 
						 | 
					d056623e60 | ||
| 
						 | 
					a281bef2b3 | ||
| 
						 | 
					4b30e9ee37 | ||
| 
						 | 
					2b1a8d34d9 | ||
| 
						 | 
					bc70235479 | ||
| 
						 | 
					857bf5486b | ||
| 
						 | 
					4d6e2801d1 | ||
| 
						 | 
					f4a80f1609 | ||
| 
						 | 
					26d298f693 | ||
| 
						 | 
					926270782f | ||
| 
						 | 
					fd7f18421d | ||
| 
						 | 
					ee53dc7286 | ||
| 
						 | 
					d565dc3225 | ||
| 
						 | 
					fe07794bba | ||
| 
						 | 
					4aa9d15438 | ||
| 
						 | 
					83e1402d8a | ||
| 
						 | 
					f1c93a8ff3 | ||
| 
						 | 
					a004c5ca9e | ||
| 
						 | 
					d6efd17100 | ||
| 
						 | 
					3aeb519068 | ||
| 
						 | 
					eb767e674f | ||
| 
						 | 
					b4af00a20f | ||
| 
						 | 
					39e574a8bd | ||
| 
						 | 
					04c06471e6 | ||
| 
						 | 
					687b01f298 | ||
| 
						 | 
					8e59e3e38c | ||
| 
						 | 
					1dec1dfb9c | ||
| 
						 | 
					292059c9cb | ||
| 
						 | 
					63b6e2a2a1 | ||
| 
						 | 
					9420fee71d | ||
| 
						 | 
					ece9341019 | ||
| 
						 | 
					e608ffdaa9 | ||
| 
						 | 
					684ffcce61 | ||
| 
						 | 
					a346745899 | ||
| 
						 | 
					5ef097f5d7 | ||
| 
						 | 
					d35a82a5b6 | ||
| 
						 | 
					b2ab9ffaec | ||
| 
						 | 
					2e88a61fa3 | ||
| 
						 | 
					9e1d3683fa | ||
| 
						 | 
					528d2dcff5 | ||
| 
						 | 
					40969e6b29 | ||
| 
						 | 
					59814ed3e5 | ||
| 
						 | 
					8f2106c5e3 | ||
| 
						 | 
					37a80ea3bc | ||
| 
						 | 
					a46350e315 | ||
| 
						 | 
					e1a6d33ed0 | ||
| 
						 | 
					4979d7fbb1 | ||
| 
						 | 
					bdcbd76e13 | ||
| 
						 | 
					081e28667e | ||
| 
						 | 
					1ef98ac6de | ||
| 
						 | 
					b90f6b40d9 | ||
| 
						 | 
					2bb388ebc8 | ||
| 
						 | 
					1714f299c9 | ||
| 
						 | 
					5571294b91 | ||
| 
						 | 
					3696407c67 | ||
| 
						 | 
					76b18e2d6e | ||
| 
						 | 
					d9d599a84d | ||
| 
						 | 
					36d08dc8f0 | ||
| 
						 | 
					3035547927 | ||
| 
						 | 
					517413928f | ||
| 
						 | 
					b3ee85ee4a | ||
| 
						 | 
					540a2571ca | ||
| 
						 | 
					53840ccffc | ||
| 
						 | 
					61d87e19f1 | ||
| 
						 | 
					63a98a2bed | ||
| 
						 | 
					4542f92842 | ||
| 
						 | 
					fa023ceccf | ||
| 
						 | 
					6c5bf0d542 | ||
| 
						 | 
					a3b4b4459c | ||
| 
						 | 
					58b1b7f825 | ||
| 
						 | 
					4f5f53706d | ||
| 
						 | 
					a87fb09763 | ||
| 
						 | 
					fb3de07e39 | ||
| 
						 | 
					02bb7498b0 | ||
| 
						 | 
					8c9f25ece1 | ||
| 
						 | 
					6356638b6a | ||
| 
						 | 
					659eb8bd36 | ||
| 
						 | 
					2ef418765c | ||
| 
						 | 
					33cffbd344 | ||
| 
						 | 
					5d877f53ed | ||
| 
						 | 
					334bd9f57d | ||
| 
						 | 
					a6fb9eef88 | ||
| 
						 | 
					d9d070e30b | ||
| 
						 | 
					73f50db89e | ||
| 
						 | 
					d1b6552ef7 | ||
| 
						 | 
					8b079c4bf2 | ||
| 
						 | 
					22db312ca1 | ||
| 
						 | 
					fbc3e2e3ce | ||
| 
						 | 
					d2d967d775 | ||
| 
						 | 
					c69bb18184 | ||
| 
						 | 
					dc5042762f | ||
| 
						 | 
					efcc597742 | ||
| 
						 | 
					b0a516034f | ||
| 
						 | 
					2880956743 | ||
| 
						 | 
					56dd7681f8 | ||
| 
						 | 
					a6d0cc6c02 | ||
| 
						 | 
					9c92ca2d27 | ||
| 
						 | 
					f8526ef3ba | ||
| 
						 | 
					96624911f0 | ||
| 
						 | 
					5967d8f2bc | ||
| 
						 | 
					dcd5da730a | ||
| 
						 | 
					3c54495507 | ||
| 
						 | 
					f9eedef7ee | ||
| 
						 | 
					de117b689e | ||
| 
						 | 
					5799a6a60c | ||
| 
						 | 
					a97e1f873f | ||
| 
						 | 
					74239cb26c | ||
| 
						 | 
					fa7a75c886 | ||
| 
						 | 
					4a187156b2 | ||
| 
						 | 
					f45b8fcc70 | ||
| 
						 | 
					1db571cb37 | ||
| 
						 | 
					8289500dd5 | ||
| 
						 | 
					ec9f642dc3 | ||
| 
						 | 
					f2a2787b42 | ||
| 
						 | 
					da0fb57df3 | ||
| 
						 | 
					10378ed083 | ||
| 
						 | 
					b0b9c0928b | ||
| 
						 | 
					9386b25b51 | ||
| 
						 | 
					9a81d7270e | ||
| 
						 | 
					29062def81 | ||
| 
						 | 
					ad851c87b5 | ||
| 
						 | 
					b67759975d | ||
| 
						 | 
					f4adada2e8 | ||
| 
						 | 
					a4671a3d88 | ||
| 
						 | 
					379d3a133c | ||
| 
						 | 
					dd8d225b4e | ||
| 
						 | 
					78693d31e9 | ||
| 
						 | 
					49d18cef95 | ||
| 
						 | 
					cc8996361c | ||
| 
						 | 
					8060744e05 | ||
| 
						 | 
					799ff464f2 | ||
| 
						 | 
					b107f9c1c9 | ||
| 
						 | 
					0e39f602ea | ||
| 
						 | 
					a391baf1be | ||
| 
						 | 
					3384173257 | ||
| 
						 | 
					51ea5a2797 | ||
| 
						 | 
					1298f6585d | ||
| 
						 | 
					2ebc21f175 | ||
| 
						 | 
					6c6ec855a7 | ||
| 
						 | 
					10bbbf2c14 | ||
| 
						 | 
					fcf810801f | ||
| 
						 | 
					665cf4fb64 | ||
| 
						 | 
					6f60468d3d | ||
| 
						 | 
					00f2912aaa | ||
| 
						 | 
					b32ffb8190 | ||
| 
						 | 
					4ceafc96b1 | ||
| 
						 | 
					bed2bda4f4 | ||
| 
						 | 
					a97bf16d2d | ||
| 
						 | 
					8a987daf3b | ||
| 
						 | 
					8d135aa5ae | ||
| 
						 | 
					0a4530cead | ||
| 
						 | 
					ad1ee839cc | ||
| 
						 | 
					1b53088a4b | ||
| 
						 | 
					a5b4c8881e | ||
| 
						 | 
					2583e00e03 | ||
| 
						 | 
					7e3f8ee419 | ||
| 
						 | 
					b035299213 | ||
| 
						 | 
					4020387145 | ||
| 
						 | 
					3e7c0ce67f | ||
| 
						 | 
					0caa4033c9 | ||
| 
						 | 
					cd65e922b2 | ||
| 
						 | 
					90f22a990d | ||
| 
						 | 
					0b74a19625 | ||
| 
						 | 
					429432f5ff | ||
| 
						 | 
					46f97f76a5 | ||
| 
						 | 
					ec3b5c9b5b | ||
| 
						 | 
					a160a8c9d5 | ||
| 
						 | 
					65d6be272d | ||
| 
						 | 
					1e75116e74 | ||
| 
						 | 
					187942d00a | ||
| 
						 | 
					418ff58e61 | ||
| 
						 | 
					bb6333e01f | ||
| 
						 | 
					df6c1f8b39 | ||
| 
						 | 
					2b9417e2e5 | ||
| 
						 | 
					f53fe9761c | ||
| 
						 | 
					902661dd8e | ||
| 
						 | 
					646dc459fa | ||
| 
						 | 
					3d48bc2f61 | ||
| 
						 | 
					28109dedf5 | ||
| 
						 | 
					10781d30d2 | ||
| 
						 | 
					c0c9a1a5f0 | ||
| 
						 | 
					13e54102fd | ||
| 
						 | 
					f4470352ff | ||
| 
						 | 
					77ad568144 | ||
| 
						 | 
					1b05a4639d | ||
| 
						 | 
					e73c4e4a44 | ||
| 
						 | 
					60c2988f53 | ||
| 
						 | 
					35dd204d76 | ||
| 
						 | 
					8eb984caec | ||
| 
						 | 
					9801c6c63f | ||
| 
						 | 
					1b754ff59d | ||
| 
						 | 
					713ddd2172 | ||
| 
						 | 
					d3cb67a4cd | ||
| 
						 | 
					1f02d433b3 | ||
| 
						 | 
					dbf6ad2ecd | ||
| 
						 | 
					c6938534bd | ||
| 
						 | 
					ac659af3ea | ||
| 
						 | 
					bdabdcbf1e | ||
| 
						 | 
					457d6f2822 | ||
| 
						 | 
					0d23dbb490 | ||
| 
						 | 
					3cd77bab28 | ||
| 
						 | 
					a39d05855e | ||
| 
						 | 
					66d0e5756f | ||
| 
						 | 
					591eb8fac1 | ||
| 
						 | 
					0ae97da489 | ||
| 
						 | 
					014a0a178b | ||
| 
						 | 
					5e8f6247fb | ||
| 
						 | 
					de1c7219ea | ||
| 
						 | 
					7352e07e12 | ||
| 
						 | 
					bfe333ed67 | ||
| 
						 | 
					ec25eab17f | ||
| 
						 | 
					e212b875fc | ||
| 
						 | 
					92f1ec6be4 | ||
| 
						 | 
					4443cc2107 | ||
| 
						 | 
					d612a5ce42 | ||
| 
						 | 
					808ecc893a | ||
| 
						 | 
					1e9087357b | ||
| 
						 | 
					124c88fba3 | ||
| 
						 | 
					ef3f4d29c9 | ||
| 
						 | 
					67478da442 | ||
| 
						 | 
					67c451783b | ||
| 
						 | 
					517e58c5df | ||
| 
						 | 
					b86dbdb22c | ||
| 
						 | 
					807bbf3461 | ||
| 
						 | 
					8b1cdad2f5 | ||
| 
						 | 
					ce25d82aa7 | ||
| 
						 | 
					d354512eca | ||
| 
						 | 
					f0131ed0f2 | ||
| 
						 | 
					a4111e1f93 | ||
| 
						 | 
					f7098a28be | ||
| 
						 | 
					fdffdc9364 | ||
| 
						 | 
					d91f0dadc9 | ||
| 
						 | 
					291309df4a | ||
| 
						 | 
					eb08e2600f | ||
| 
						 | 
					0faa51794d | ||
| 
						 | 
					5f5017defd | ||
| 
						 | 
					737023e9d4 | ||
| 
						 | 
					e98d85bf09 | ||
| 
						 | 
					6adefd13c1 | ||
| 
						 | 
					5c37031b1c | ||
| 
						 | 
					141a82674e | ||
| 
						 | 
					2423b41fd9 | ||
| 
						 | 
					f85277c7b3 | ||
| 
						 | 
					d60b955324 | ||
| 
						 | 
					663636b515 | ||
| 
						 | 
					8bccbf9afb | ||
| 
						 | 
					1d10b782b4 | ||
| 
						 | 
					3cd48f9a41 | ||
| 
						 | 
					d50ef1d333 | ||
| 
						 | 
					fbcd14b30b | ||
| 
						 | 
					09ca3690b5 | ||
| 
						 | 
					6db145dd07 | ||
| 
						 | 
					0ff4ffd27f | ||
| 
						 | 
					ba5a68e731 | ||
| 
						 | 
					df358f42e0 | ||
| 
						 | 
					0e518edee4 | ||
| 
						 | 
					dea58d2e88 | ||
| 
						 | 
					97efb246b3 | ||
| 
						 | 
					17a3454b92 | ||
| 
						 | 
					3680bb43cd | ||
| 
						 | 
					b0180d6665 | ||
| 
						 | 
					f9be91101f | ||
| 
						 | 
					e16c9c9ecd | ||
| 
						 | 
					57c86cec8e | ||
| 
						 | 
					d600998f7e | ||
| 
						 | 
					a75365ea8e | ||
| 
						 | 
					8b34f224e7 | ||
| 
						 | 
					97d664a128 | ||
| 
						 | 
					04bcd2ff23 | ||
| 
						 | 
					3f9482f7bc | ||
| 
						 | 
					ebf15d6151 | ||
| 
						 | 
					38f5196684 | ||
| 
						 | 
					31457d7be1 | ||
| 
						 | 
					a196c598b6 | 
@@ -1,6 +0,0 @@
 | 
			
		||||
asterisk
 | 
			
		||||
build.h
 | 
			
		||||
ast_expr.c
 | 
			
		||||
.version
 | 
			
		||||
.depend
 | 
			
		||||
.applied
 | 
			
		||||
							
								
								
									
										4
									
								
								CREDITS
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										4
									
								
								CREDITS
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -58,12 +58,14 @@ Thorsten Lockert - OpenBSD, FreeBSD ports, making MacOS X port run on 10.3,
 | 
			
		||||
	bugs. tholo@sigmasoft.com
 | 
			
		||||
Brian West - ODBC support and Bug Marshaling  
 | 
			
		||||
William Waites - syslog support, SIP NAT traversal for SIP-UA. ww@styx.org
 | 
			
		||||
Rich Murphey - Porting to FreeBSD, NetBSD, OpenBSD, and Darwin.
 | 
			
		||||
	rich@whiteoaklabs.com  http://whiteoaklabs.com
 | 
			
		||||
 | 
			
		||||
=== OTHER CONTRIBUTIONS ===
 | 
			
		||||
John Todd - Monkey sounds and associated teletorture prompt
 | 
			
		||||
 | 
			
		||||
=== HOLD MUSIC ===
 | 
			
		||||
Music provided by www.freeplaymusic.com
 | 
			
		||||
Music provided by www.opsound.org
 | 
			
		||||
 | 
			
		||||
=== OTHER SOURCE CODE IN ASTERISK ===
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										283
									
								
								CHANGES → ChangeLog
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										283
									
								
								CHANGES → ChangeLog
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -1,4 +1,284 @@
 | 
			
		||||
 NOTE: Corrections or additions to the ChangeLog may be submitted to
 | 
			
		||||
       http://bugs.digium.com.  Documentation and formatting fixes are not
 | 
			
		||||
       not listed here.  A complete listing of changes is available through
 | 
			
		||||
       the Asterisk-commits mailing list hosted at http://lists.digium.com.
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.12
 | 
			
		||||
 | 
			
		||||
 -- chan_skinny
 | 
			
		||||
    -- An exploitable buffer overflow in this channel driver was fixed.
 | 
			
		||||
	
 | 
			
		||||
Asterisk 1.0.11.1
 | 
			
		||||
 | 
			
		||||
 -- chan_iax2
 | 
			
		||||
    -- A bug in the vulnerability fix in the last release could cause Asterisk
 | 
			
		||||
       to improperly reject incoming video frames and result in deadlocks.
 | 
			
		||||
	
 | 
			
		||||
Asterisk 1.0.11
 | 
			
		||||
 | 
			
		||||
 -- chan_iax2
 | 
			
		||||
    -- A security vulnerability that could lead to denial of service attacks
 | 
			
		||||
       and Asterisk process crashes was fixed in this release.Asterisk 1.0.11
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.10
 | 
			
		||||
 | 
			
		||||
 -- chan_local
 | 
			
		||||
    -- In releases 1.0.8 and 1.0.9, the Local channels that are created would
 | 
			
		||||
       not be masqueraded into the new channel type.  This has now been fixed.
 | 
			
		||||
 -- chan_sip
 | 
			
		||||
    -- The 'insecure' options have been changed to support matching peersby IP
 | 
			
		||||
       only, not requiring authentication on incoming invites, or both. Before,
 | 
			
		||||
       to not require authentication on incoming invites also required matching
 | 
			
		||||
       peers based on IP only.
 | 
			
		||||
 -- chan_zap
 | 
			
		||||
    -- Before, call waiting could occur during the initial ringing on the line.
 | 
			
		||||
       This has now been fixed.
 | 
			
		||||
 -- app_disa
 | 
			
		||||
    -- We will now not set the accountcode if one is not supplied. 
 | 
			
		||||
 -- app_meetme
 | 
			
		||||
    -- If the first caller into a conference hangs up while being prompted for
 | 
			
		||||
       the conference pin number, the conference will no longer be held open.
 | 
			
		||||
 -- app_userevent
 | 
			
		||||
    -- Events created with this application were indicated as a "call" event
 | 
			
		||||
       instead of a "user" event.  This made the "user" event permissions
 | 
			
		||||
       not work correctly.
 | 
			
		||||
 -- app_voicemail
 | 
			
		||||
    -- When using the externpass option for voicemail, the password will be
 | 
			
		||||
       immediately updated in memory as well, instead of having to wait for
 | 
			
		||||
       the next time the configuration is reloaded. 
 | 
			
		||||
 -- app_zapras
 | 
			
		||||
    -- We now ensure buffer policy is restored after RAS is done with a channel.
 | 
			
		||||
       This could cause audio problems on the channel after zapras is done
 | 
			
		||||
       with it. 
 | 
			
		||||
 -- res_agi
 | 
			
		||||
    -- We now unmask the SIGHUP signal before executing an AGI script.  This
 | 
			
		||||
       fixes problems where some AGI scripts would continue running long after
 | 
			
		||||
       the call is over.
 | 
			
		||||
 -- extensions
 | 
			
		||||
    -- A potential crash has been fixed when calling LEN() to get the length of
 | 
			
		||||
       a string that was 80 characters or larger.
 | 
			
		||||
 -- general
 | 
			
		||||
    -- Added man pages for astgenkey, autosupport, and safe_asterisk
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.9
 | 
			
		||||
 | 
			
		||||
 -- fix bug in callerid matching in the dialplan that was introduced in 1.0.8
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.8
 | 
			
		||||
 | 
			
		||||
 -- chan_zap
 | 
			
		||||
    -- Asterisk will now also look in the regular context for the fax extension
 | 
			
		||||
       while executing a macro.  Previously, for this to work, the fax extension
 | 
			
		||||
       would have to be included in the macro definition.
 | 
			
		||||
    -- On some systems, ALERTING will be sent after PROCEEDING, so code has been
 | 
			
		||||
       added to account for this case.
 | 
			
		||||
    -- If no extension is specified on an overlap call, the 's' extension will 
 | 
			
		||||
       be used.
 | 
			
		||||
 -- chan_sip
 | 
			
		||||
    -- We no longer send a "to" tag on "100 Trying" messages, as it is 
 | 
			
		||||
       inappropriate to do so.
 | 
			
		||||
    -- We now respond correctly to an invite for T.38 with a "488 Not acceptable
 | 
			
		||||
       here"
 | 
			
		||||
    -- We now discard saved tags on 401/407 responses in case the provider we're
 | 
			
		||||
       talking to tries to pull a dirty trick on us and change it.
 | 
			
		||||
    -- rtptimeout options will now be correctly set on a peer basis rather than
 | 
			
		||||
       only global
 | 
			
		||||
 -- chan_mgcp
 | 
			
		||||
    -- Fixed setting of accountcode
 | 
			
		||||
    -- Fixed where *67 to block callerid only worked for first call
 | 
			
		||||
 -- chan_agent
 | 
			
		||||
    -- We now will not pass audio until the agent has acked the call if the 
 | 
			
		||||
       configuration
 | 
			
		||||
       is set up for the agent to do so.
 | 
			
		||||
 -- chan_alsa
 | 
			
		||||
    -- Fixed problems with the unloading of this module
 | 
			
		||||
 -- res_agi
 | 
			
		||||
    -- A fix has been added to prevent calls from being hung up when more than 
 | 
			
		||||
       one call is executing an AGI script calling the GET DATA command.
 | 
			
		||||
    -- AGI scripts will now continue to run even if a file was not found with
 | 
			
		||||
       the GET DATA command.
 | 
			
		||||
    -- When calling SAY NUMBER with a number like 09, we will now say "nine" 
 | 
			
		||||
       instead of "zero"
 | 
			
		||||
 -- app_dial
 | 
			
		||||
    -- There was a problem where text frames would not be forwarded before the
 | 
			
		||||
       channel has been answered. 
 | 
			
		||||
 -- app_disa
 | 
			
		||||
    -- Fixed the timeout used when no password is set
 | 
			
		||||
 -- app_queue
 | 
			
		||||
    -- Distinctive ring has been fixed to work for queue members
 | 
			
		||||
  -- rtp
 | 
			
		||||
    -- Fixed a logic error when setting the "rtpchecksums" option
 | 
			
		||||
 -- say.c
 | 
			
		||||
    -- A problem has been fixed with saying the date in Spanish.
 | 
			
		||||
 -- Makefile
 | 
			
		||||
    -- A line was missing for the autosupport script that caused "make rpm" to 
 | 
			
		||||
       fail
 | 
			
		||||
 -- format_wav_gsm
 | 
			
		||||
    -- Fixed a problem with wav formatting that prevented files from being 
 | 
			
		||||
       played in some media players
 | 
			
		||||
 -- pbx_spool
 | 
			
		||||
    -- Fixed if the last line of text in a file for the call spool did not 
 | 
			
		||||
       contain a new line, it would not be processed
 | 
			
		||||
 -- logger
 | 
			
		||||
    -- Fixed the logger so that color escape sequences wouldn't be sent to the 
 | 
			
		||||
       logs
 | 
			
		||||
 -- format_sln
 | 
			
		||||
    -- A lot of changes were made to correctly handle signed linear format on
 | 
			
		||||
       big endian machines
 | 
			
		||||
 -- asterisk.conf
 | 
			
		||||
     -- fix 'highpriority' option for asterisk.conf
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.7
 | 
			
		||||
 | 
			
		||||
 -- chan_sip
 | 
			
		||||
    -- The fix for some codec availibility issues in 1.0.6 caused music on hold
 | 
			
		||||
       problems, but has now been fixed.
 | 
			
		||||
 -- chan_skinny
 | 
			
		||||
    -- A check has been added to avoid a crash.
 | 
			
		||||
 -- chan_iax2
 | 
			
		||||
    -- A feature has been added to CVS head to have the option of sending 
 | 
			
		||||
       timestamps with trunk frames.  It is not supported in 1.0, but a change 
 | 
			
		||||
       has been made so that it will at least not choke if sent trunk
 | 
			
		||||
       timestamps.
 | 
			
		||||
 -- app_voicemail
 | 
			
		||||
    -- Some checks have been added to avoid a crash.
 | 
			
		||||
 -- speex
 | 
			
		||||
    -- The path /usr/include/speex has been added for a place to look for the 
 | 
			
		||||
       speex header.
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.6
 | 
			
		||||
 | 
			
		||||
 -- chan_iax2:
 | 
			
		||||
    -- Fixed a bug dealing with a division by zero that could cause a crash
 | 
			
		||||
 -- chan_sip:
 | 
			
		||||
    -- Behavior was changed so that when a registration fails due to DNS 
 | 
			
		||||
       resolution issues, a retry will be attempted in 20 seconds.
 | 
			
		||||
    -- Peer settings were not reset to null values when reloading the 
 | 
			
		||||
       configuration file. Behavior has been changed so that these values are 
 | 
			
		||||
       now cleared.
 | 
			
		||||
    -- 'restrictcid' now properly works on MySQL peers.
 | 
			
		||||
    -- Only use the default callerid if it has been specified.
 | 
			
		||||
    -- Asterisk was not sending the same From: line in SIP messages during 
 | 
			
		||||
       certain times. Fixed to make sure it stays the same. This makes some 
 | 
			
		||||
       providers happier, to a working state.
 | 
			
		||||
    -- Certain circumstances involving a blank callerid caused asterisk to 
 | 
			
		||||
       segmentation fault.
 | 
			
		||||
    -- There was a problem incorrectly matching codec availablity when global 
 | 
			
		||||
       preferences were different from that of the user.  To fix this, 
 | 
			
		||||
       processing of SDP data has been moved to after determining who the call 
 | 
			
		||||
       is coming from.
 | 
			
		||||
    -- Asterisk would run out of RTP ports while waiting for SUBSCRIBE's to 
 | 
			
		||||
       expire even though an RTP port isn't needed in this case.  This has been
 | 
			
		||||
       fixed by releasing the ports early.
 | 
			
		||||
 -- chan_zap:
 | 
			
		||||
    -- During a certain scenario when using flash and '#' transfers you would 
 | 
			
		||||
       hear the other person and the music they were hearing. This has been 
 | 
			
		||||
       fixed.
 | 
			
		||||
    -- A fix for a compilation issue with gcc4 was added.
 | 
			
		||||
 -- chan_modem_bestdata:
 | 
			
		||||
    -- A fix for a compilation issue with gcc4 was added.
 | 
			
		||||
 -- format_g729:
 | 
			
		||||
    -- Treat a 10-byte read as an end of file indication instead of an error. 
 | 
			
		||||
       Some G729 encoders like to put 10-bytes at the end to indicate this.
 | 
			
		||||
 -- res_features:
 | 
			
		||||
    -- During certain situations when parking a call, both endpoints would get 
 | 
			
		||||
       musiconhold. This has been fixed so the individual who parked the call 
 | 
			
		||||
       will hear the digits and not musiconhold.
 | 
			
		||||
 -- app_dial:
 | 
			
		||||
    -- DIALEDPEERNUMBER is now being set, so if you attempted to use it in the 
 | 
			
		||||
       past and failed, it should work now.
 | 
			
		||||
    -- A callerid change caused many headaches, this has been reversed to the 
 | 
			
		||||
       original 1.0 behavior.
 | 
			
		||||
    -- A crash caused with the combination of the 'g' option and # transfer was
 | 
			
		||||
       fixed.
 | 
			
		||||
 -- app_voicemail:
 | 
			
		||||
    -- If two people hit the voicemail system at the same time, and were leaving
 | 
			
		||||
       a message the second message was overwriting the first. This has been 
 | 
			
		||||
       fixed so that each one is distinct and will not overwrite eachother.
 | 
			
		||||
 -- cdr_tds:
 | 
			
		||||
    -- If the server you were using was going down, it had the potential to 
 | 
			
		||||
       bring your asterisk server down with it. Extra stuff has been added so 
 | 
			
		||||
       as to bring in more error/connection checking.
 | 
			
		||||
 -- cdr_pgsql:
 | 
			
		||||
    -- This will now attempt to reconnect after a connection problem.
 | 
			
		||||
 -- IAXY firmware:
 | 
			
		||||
    -- This has been updated to version 23.  It includes a fix for lost
 | 
			
		||||
       registrations.
 | 
			
		||||
 -- internals
 | 
			
		||||
    -- Behavior was changed for 'show codec <number>' to make it more intuitive.
 | 
			
		||||
    -- DNS failures and asterisk do not get along too well, this is not totally
 | 
			
		||||
       the case anymore.
 | 
			
		||||
    -- Asterisk will now handle DNS failures at startup more gracefully, and 
 | 
			
		||||
       won't crash and burn
 | 
			
		||||
    -- Choosing to append to a wave file would render the outputted wave file 
 | 
			
		||||
       corrupt. Appending now works again.
 | 
			
		||||
    -- If you failed to define certain keys, asterisk had the potential to crash
 | 
			
		||||
       when seeing if you had used them.
 | 
			
		||||
    -- Attempting to use such things as ${EXTEN:-1} gave a wrong return value. 
 | 
			
		||||
       However, this was never a documented feature...
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.5
 | 
			
		||||
 | 
			
		||||
 -- chan_zap
 | 
			
		||||
    -- fix a callerid bug introduced in 1.0.4
 | 
			
		||||
 -- app_queue
 | 
			
		||||
    -- fix some penalty behavior
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.4
 | 
			
		||||
 | 
			
		||||
 -- general
 | 
			
		||||
    -- fix memory leak evident with extensive use of variables
 | 
			
		||||
    -- update IAXy firmware to version 22
 | 
			
		||||
       -- enable some special write protection
 | 
			
		||||
       -- enable outbound DTMF
 | 
			
		||||
    -- fix seg fault with incorrect usage of SetVar
 | 
			
		||||
    -- other minor fixes including typos and doc updates
 | 
			
		||||
 -- chan_sip
 | 
			
		||||
   -- fix codecs to not be case sensitive
 | 
			
		||||
   -- Re-use auth credentials
 | 
			
		||||
   -- fix MWI when using type=friend
 | 
			
		||||
   -- fix global NAT option
 | 
			
		||||
 -- chan_agent / chan_local
 | 
			
		||||
   -- fix incorrect use count
 | 
			
		||||
 -- chan_zap
 | 
			
		||||
   -- Allow CID rings to be configured in zapata.conf
 | 
			
		||||
      -- no more patching needed for UK CID
 | 
			
		||||
 -- app_macro 
 | 
			
		||||
    -- allow Macros to exit with '*' or '#' like regular extension processing
 | 
			
		||||
 -- app_voicemail
 | 
			
		||||
   -- don't allow '#' as a password
 | 
			
		||||
   -- add option to save voicemail before going to the operator
 | 
			
		||||
   -- fix global operator=yes
 | 
			
		||||
 -- app_read
 | 
			
		||||
   -- return 0 instead of -1 if user enters nothing
 | 
			
		||||
 -- res_agi
 | 
			
		||||
    -- don't exit AGI when file not found to stream
 | 
			
		||||
    -- send script parameter when using FastAGI
 | 
			
		||||
 
 | 
			
		||||
Asterisk 1.0.3
 | 
			
		||||
 | 
			
		||||
 -- chan_zap
 | 
			
		||||
    -- fix seg fault when doing *0 to flash a trunk
 | 
			
		||||
 -- rtp
 | 
			
		||||
    -- seg fault fix
 | 
			
		||||
 -- chan_sip
 | 
			
		||||
    -- fix to prevent seg fault when attempting a transfer
 | 
			
		||||
    -- fix bug with supervised transfers
 | 
			
		||||
    -- fix codec preferences
 | 
			
		||||
 -- chan_h323
 | 
			
		||||
    -- fix compilation problem
 | 
			
		||||
 -- chan_iax2
 | 
			
		||||
   -- avoid a deadlock related to a static config of a BUNCH of peers
 | 
			
		||||
 -- cdr_pgsql
 | 
			
		||||
    -- fix memory leak when reading config
 | 
			
		||||
 -- Numerous other minor bug fixes
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.2
 | 
			
		||||
 | 
			
		||||
 -- Major bugfix release
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.1
 | 
			
		||||
 | 
			
		||||
 -- Added AGI over TCP support
 | 
			
		||||
 -- Add ability to purge callers from queue if no agents are logged in
 | 
			
		||||
 -- Fix inband PRI indication detection
 | 
			
		||||
@@ -6,6 +286,7 @@ Asterisk 1.0.1
 | 
			
		||||
 -- Fixed seg fault for ast_control_streamfile
 | 
			
		||||
 -- Make pick-up extension configurable via features.conf 
 | 
			
		||||
 -- Numerous other bug fixes
 | 
			
		||||
 | 
			
		||||
Asterisk 1.0.0
 | 
			
		||||
 -- Use Q.931 standard cause codes for asterisk cause codes
 | 
			
		||||
 -- Bug fixes from the bug tracker
 | 
			
		||||
@@ -13,7 +294,7 @@ Asterisk 1.0-RC2
 | 
			
		||||
 -- Additional CDR backends
 | 
			
		||||
 -- Allow muted to reconnect
 | 
			
		||||
 -- Call parking improvements (including SIP parking support)
 | 
			
		||||
 -- Added licensed hold music from FreePlayMusic
 | 
			
		||||
 -- Added licensed hold music from opsound.org
 | 
			
		||||
 -- GR-303 and Zap improvements
 | 
			
		||||
 -- More bug fixes from the bug tracker
 | 
			
		||||
 -- Improved FreeBSD/OpenBSD/MacOS X support
 | 
			
		||||
							
								
								
									
										56
									
								
								Makefile
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										56
									
								
								Makefile
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -38,6 +38,7 @@ OPTIONS+=$(shell if $(CC) -mcpu=v8 -S -o /dev/null -xc /dev/null >/dev/null 2>&1
 | 
			
		||||
OPTIONS+=-fomit-frame-pointer
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
MPG123TARG=linux
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(findstring BSD,${OSARCH}),BSD)
 | 
			
		||||
@@ -142,11 +143,13 @@ CFLAGS+=$(shell if test ${OSVERSION} -lt 500016 ; then echo "-D_THREAD_SAFE"; fi
 | 
			
		||||
LIBS+=$(shell if test  ${OSVERSION} -lt 502102 ; then echo "-lc_r"; else echo "-pthread"; fi)
 | 
			
		||||
INCLUDE+=-I/usr/local/include
 | 
			
		||||
CFLAGS+=$(shell if [ -d /usr/local/include/spandsp ]; then echo "-I/usr/local/include/spandsp"; fi)
 | 
			
		||||
MPG123TARG=freebsd
 | 
			
		||||
endif # FreeBSD
 | 
			
		||||
 | 
			
		||||
ifeq (${OSARCH},NetBSD)
 | 
			
		||||
CFLAGS+=-pthread
 | 
			
		||||
INCLUDE+=-I/usr/local/include
 | 
			
		||||
INCLUDE+=-I/usr/local/include -I/usr/pkg/include
 | 
			
		||||
MPG123TARG=netbsd
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq (${OSARCH},OpenBSD)
 | 
			
		||||
@@ -197,7 +200,7 @@ ifeq (${OSARCH},FreeBSD)
 | 
			
		||||
LIBS+=-lcrypto
 | 
			
		||||
endif
 | 
			
		||||
ifeq (${OSARCH},NetBSD)
 | 
			
		||||
LIBS+=-lpthread -lcrypto -lm -L/usr/local/lib -lncurses
 | 
			
		||||
LIBS+=-lpthread -lcrypto -lm -L/usr/local/lib -L/usr/pkg/lib -lncurses
 | 
			
		||||
endif
 | 
			
		||||
ifeq (${OSARCH},OpenBSD)
 | 
			
		||||
LIBS=-lcrypto -lpthread -lm -lncurses
 | 
			
		||||
@@ -211,14 +214,25 @@ OBJS=io.o sched.o logger.o frame.o loader.o config.o channel.o \
 | 
			
		||||
	astmm.o enum.o srv.o dns.o aescrypt.o aestab.o aeskey.o \
 | 
			
		||||
	utils.o 
 | 
			
		||||
ifeq (${OSARCH},Darwin)
 | 
			
		||||
OBJS+=poll.o dlfcn.o
 | 
			
		||||
ASTLINK=-Wl,-dynamic
 | 
			
		||||
SOLINK=-dynamic -bundle -undefined suppress -force_flat_namespace
 | 
			
		||||
OBJS+= poll.o
 | 
			
		||||
CFLAGS+=-DPOLLCOMPAT
 | 
			
		||||
else
 | 
			
		||||
ASTLINK=-Wl,-E 
 | 
			
		||||
SOLINK=-shared -Xlinker -x
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/sys/poll.h),)
 | 
			
		||||
  OBJS+= poll.o
 | 
			
		||||
  CFLAGS+=-DPOLLCOMPAT
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
ifeq ($(wildcard $(CROSS_COMPILE_TARGET)/usr/include/dlfcn.h),)
 | 
			
		||||
  OBJS+= dhfcn.o
 | 
			
		||||
  CFLAGS+=-DDLFCNCOMPAT
 | 
			
		||||
endif
 | 
			
		||||
 | 
			
		||||
CC=gcc
 | 
			
		||||
INSTALL=install
 | 
			
		||||
 | 
			
		||||
@@ -307,7 +321,7 @@ clean:
 | 
			
		||||
	rm -f build.h 
 | 
			
		||||
	rm -f ast_expr.c
 | 
			
		||||
	@if [ -e editline/Makefile ]; then $(MAKE) -C editline distclean ; fi
 | 
			
		||||
	@if [ -d mpg123-0.59r ]; then make -C mpg123-0.59r clean; fi
 | 
			
		||||
	@if [ -d mpg123-0.59r ]; then $(MAKE) -C mpg123-0.59r clean; fi	
 | 
			
		||||
	$(MAKE) -C db1-ast clean
 | 
			
		||||
	$(MAKE) -C stdtime clean
 | 
			
		||||
 | 
			
		||||
@@ -339,7 +353,7 @@ datafiles: all
 | 
			
		||||
			exit 1; \
 | 
			
		||||
		fi; \
 | 
			
		||||
	done
 | 
			
		||||
	for x in sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-*; do \
 | 
			
		||||
	for x in sounds/vm-* sounds/transfer* sounds/pbx-* sounds/ss-* sounds/beep* sounds/dir-* sounds/conf-* sounds/agent-* sounds/invalid* sounds/tt-* sounds/auth-* sounds/privacy-* sounds/queue-* sounds/hello-*; do \
 | 
			
		||||
		if grep -q "^%`basename $$x`%" sounds.txt; then \
 | 
			
		||||
			install -m 644 $$x $(DESTDIR)$(ASTVARLIBDIR)/sounds ; \
 | 
			
		||||
		else \
 | 
			
		||||
@@ -374,6 +388,7 @@ bininstall: all
 | 
			
		||||
	mkdir -p $(DESTDIR)$(ASTSPOOLDIR)/tmp
 | 
			
		||||
	install -m 755 asterisk $(DESTDIR)$(ASTSBINDIR)/
 | 
			
		||||
	install -m 755 contrib/scripts/astgenkey $(DESTDIR)$(ASTSBINDIR)/
 | 
			
		||||
	install -m 755 contrib/scripts/autosupport $(DESTDIR)$(ASTSBINDIR)/
 | 
			
		||||
	if [ ! -f $(DESTDIR)$(ASTSBINDIR)/safe_asterisk ]; then \
 | 
			
		||||
		install -m 755 contrib/scripts/safe_asterisk $(DESTDIR)$(ASTSBINDIR)/ ;\
 | 
			
		||||
	fi
 | 
			
		||||
@@ -398,6 +413,9 @@ bininstall: all
 | 
			
		||||
	install -m 644 keys/iaxtel.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
 | 
			
		||||
	install -m 644 keys/freeworlddialup.pub $(DESTDIR)$(ASTVARLIBDIR)/keys
 | 
			
		||||
	install -m 644 asterisk.8.gz $(DESTDIR)$(ASTMANDIR)/man8
 | 
			
		||||
	install -m 644 contrib/scripts/astgenkey.8 $(DESTDIR)$(ASTMANDIR)/man8
 | 
			
		||||
	install -m 644 contrib/scripts/autosupport.8 $(DESTDIR)$(ASTMANDIR)/man8
 | 
			
		||||
	install -m 644 contrib/scripts/safe_asterisk.8 $(DESTDIR)$(ASTMANDIR)/man8
 | 
			
		||||
	if [ -d contrib/firmware/iax ]; then \
 | 
			
		||||
		install -m 644 contrib/firmware/iax/iaxy.bin $(DESTDIR)$(ASTVARLIBDIR)/firmware/iax/iaxy.bin; \
 | 
			
		||||
	else \
 | 
			
		||||
@@ -405,7 +423,7 @@ bininstall: all
 | 
			
		||||
	fi 
 | 
			
		||||
	( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds  ; ln -s $(ASTSPOOLDIR)/vm . )
 | 
			
		||||
	( cd $(DESTDIR)$(ASTVARLIBDIR)/sounds  ; ln -s $(ASTSPOOLDIR)/voicemail . )
 | 
			
		||||
	if [ -f mpg123-0.59r/mpg123 ]; then make -C mpg123-0.59r install; fi
 | 
			
		||||
	if [ -f mpg123-0.59r/mpg123 ]; then $(MAKE) -C mpg123-0.59r install; fi
 | 
			
		||||
	@echo " +---- Asterisk Installation Complete -------+"  
 | 
			
		||||
	@echo " +                                           +"
 | 
			
		||||
	@echo " +    YOU MUST READ THE SECURITY DOCUMENT    +"
 | 
			
		||||
@@ -427,6 +445,19 @@ bininstall: all
 | 
			
		||||
	@echo " + **Note** This requires that you have      +"
 | 
			
		||||
	@echo " + doxygen installed on your local system    +"
 | 
			
		||||
	@echo " +-------------------------------------------+"
 | 
			
		||||
	@echo " +                                           +"
 | 
			
		||||
	@echo " + ** NOTE FOR DOWNGRADING FROM CVS HEAD **  +"
 | 
			
		||||
	@echo " +                                           +"
 | 
			
		||||
	@echo " + If you are downgrading from CVS HEAD to   +"
 | 
			
		||||
	@echo " + a stable release, remember to delete      +"
 | 
			
		||||
	@echo " + everything from your asterisk modules     +"
 | 
			
		||||
	@echo " + directory (/usr/lib/asterisk/modules/)    +"
 | 
			
		||||
	@echo " + and the asterisk header directory         +"
 | 
			
		||||
	@echo " + (/usr/include/asterisk/)                  +"
 | 
			
		||||
	@echo " + before doing a '$(MAKE) install'.            +"
 | 
			
		||||
	@echo " +                                           +"
 | 
			
		||||
	@echo " +-------------------------------------------+"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
install: all datafiles bininstall
 | 
			
		||||
 | 
			
		||||
@@ -518,7 +549,7 @@ mpg123:
 | 
			
		||||
	@wget -V >/dev/null || (echo "You need wget" ; false )
 | 
			
		||||
	[ -f mpg123-0.59r.tar.gz ] || wget http://www.mpg123.de/mpg123/mpg123-0.59r.tar.gz
 | 
			
		||||
	[ -d mpg123-0.59r ] || tar xfz mpg123-0.59r.tar.gz
 | 
			
		||||
	make -C mpg123-0.59r linux
 | 
			
		||||
	$(MAKE) -C mpg123-0.59r $(MPG123TARG)
 | 
			
		||||
 | 
			
		||||
config:
 | 
			
		||||
	if [ -d /etc/rc.d/init.d ]; then \
 | 
			
		||||
@@ -537,12 +568,21 @@ depend: .depend
 | 
			
		||||
	for x in $(SUBDIRS); do $(MAKE) -C $$x depend || exit 1 ; done
 | 
			
		||||
 | 
			
		||||
.depend:
 | 
			
		||||
	@if ! which mpg123 &>/dev/null ; then \
 | 
			
		||||
		echo "*** You don't have mpg123 installed. You're going to need ***";\
 | 
			
		||||
		echo "***       it if you want MusicOnHold                      ***";\
 | 
			
		||||
	elif ! mpg123 --longhelp 2>&1 | grep .59r &>/dev/null ; then \
 | 
			
		||||
			echo "*************************************************************";\
 | 
			
		||||
			echo "*** You have the WRONG version of mpg123... you need .59r ***";\
 | 
			
		||||
			echo "*** Use 'make mpg123' to get the right verison            ***";\
 | 
			
		||||
			echo "*************************************************************";\
 | 
			
		||||
	fi
 | 
			
		||||
	./mkdep ${CFLAGS} `ls *.c`
 | 
			
		||||
 | 
			
		||||
FORCE:
 | 
			
		||||
 | 
			
		||||
%_env:
 | 
			
		||||
	make -C $(shell echo $@ | sed "s/_env//g") env
 | 
			
		||||
	$(MAKE) -C $(shell echo $@ | sed "s/_env//g") env
 | 
			
		||||
 | 
			
		||||
env:
 | 
			
		||||
	env
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								README
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										61
									
								
								README
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -136,6 +136,67 @@ parameters.  For example, the line "channel => 25-47" creates objects for
 | 
			
		||||
the channels 25 through 47 of the tormenta card, obtaining the settings
 | 
			
		||||
from the variables specified above.
 | 
			
		||||
 | 
			
		||||
* SPECIAL NOTE ON TIME
 | 
			
		||||
  
 | 
			
		||||
  Those using SIP phones should be aware the Asterisk is sensitive to
 | 
			
		||||
large jumps in time.  Manually changing the system time using date(1)
 | 
			
		||||
(or other similar commands) may cause SIP registrations and other
 | 
			
		||||
internal processes to fail.  If your system cannot keep accurate time
 | 
			
		||||
by itself use NTP (http://www.ntp.org/) to keep the system clock
 | 
			
		||||
synchronized to "real time".  NTP is designed to keep the system clock
 | 
			
		||||
synchronized by speeding up or slowing down the system clock until it
 | 
			
		||||
is synchronized to "real time" rather than by jumping the time and
 | 
			
		||||
causing discontinuities. Most Linux distributions include precompiled
 | 
			
		||||
versions of NTP.  Beware of some time synchronization methods that get
 | 
			
		||||
the correct real time periodically and then manually set the system
 | 
			
		||||
clock.
 | 
			
		||||
 | 
			
		||||
  Apparent time changes due to daylight savings time are just that,
 | 
			
		||||
apparent.  The use of daylight savings time in a Linux system is
 | 
			
		||||
purely a user interface issue and does not affect the operation of the
 | 
			
		||||
Linux kernel or Asterisk.  The system clock on Linux kernels operates
 | 
			
		||||
on UTC.  UTC does not use daylight savings time.
 | 
			
		||||
   
 | 
			
		||||
  Also note that this issue is separate from the clocking of TDM
 | 
			
		||||
channels, and is known to at least affect SIP registrations.
 | 
			
		||||
 | 
			
		||||
* FILE DESCRIPTORS
 | 
			
		||||
 | 
			
		||||
  Depending on the size of your system and your configuration,
 | 
			
		||||
Asterisk can consume a large number of file descriptors.  In UNIX,
 | 
			
		||||
file descriptors are used for more than just files on disk.  File
 | 
			
		||||
descriptors are also used for handling network communication
 | 
			
		||||
(e.g. SIP, IAX2, or H.323 calls) and hardware access (e.g. analog and
 | 
			
		||||
digital trunk hardware).  Asterisk accesses many on-disk files for
 | 
			
		||||
everything from configuration information to voicemail storage.
 | 
			
		||||
 | 
			
		||||
  Most systems limit the number of file descriptors that Asterisk can
 | 
			
		||||
have open at one time.  This can limit the number of simultaneous
 | 
			
		||||
calls that your system can handle.  For example, if the limit is set
 | 
			
		||||
at 1024 (a common default value) Asterisk can handle approxiately 150
 | 
			
		||||
SIP calls simultaneously.  To change the number of file descriptors
 | 
			
		||||
follow the instructions for your system below:
 | 
			
		||||
 | 
			
		||||
== PAM-based Linux System ==
 | 
			
		||||
 | 
			
		||||
  If your system uses PAM (Pluggable Authentication Modules) edit
 | 
			
		||||
/etc/security/limits.conf.  Add these lines to the bottom of the file:
 | 
			
		||||
 | 
			
		||||
root            soft    nofile          4096
 | 
			
		||||
root            hard    nofile          8196
 | 
			
		||||
asterisk        soft    nofile          4096
 | 
			
		||||
asterisk        hard    nofile          8196
 | 
			
		||||
 | 
			
		||||
(adjust the numbers to taste).  You may need to reboot the system for
 | 
			
		||||
these changes to take effect.
 | 
			
		||||
 | 
			
		||||
== Generic UNIX System ==
 | 
			
		||||
 | 
			
		||||
  If there are no instructions specifically adapted to your system
 | 
			
		||||
above you can try adding the command "ulimit -n 8192" to the script
 | 
			
		||||
that starts Asterisk.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
* MORE INFORMATION
 | 
			
		||||
 | 
			
		||||
See the doc directory for more documentation.
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +0,0 @@
 | 
			
		||||
About Hold Music
 | 
			
		||||
================
 | 
			
		||||
Digium has licensed the music included with
 | 
			
		||||
the Asterisk distribution From FreePlayMusic
 | 
			
		||||
for use and distribution with Asterisk.  It
 | 
			
		||||
is licensed ONLY for use as hold music within
 | 
			
		||||
an Asterisk based PBX.
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										22
									
								
								README.opsound
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								README.opsound
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
About Hold Music
 | 
			
		||||
================
 | 
			
		||||
These files were obtained from http://opsound.org, where the authors placed them
 | 
			
		||||
under the Creative Commons Attribution-Share Alike 2.5 license, a copy of which
 | 
			
		||||
may be found at http://creativecommons.org.
 | 
			
		||||
 | 
			
		||||
Credits
 | 
			
		||||
================
 | 
			
		||||
macroform-cold_day - Paul Shuler (Macroform)
 | 
			
		||||
paulshuler@gmail.com - http://macroform.bandcamp.com/
 | 
			
		||||
 | 
			
		||||
macroform-robot_dity - Paul Shuler (Macroform)
 | 
			
		||||
paulshuler@gmail.com - http://macroform.bandcamp.com/
 | 
			
		||||
 | 
			
		||||
macroform-the_simplicity - Paul Shuler (Macroform)
 | 
			
		||||
paulshuler@gmail.com - http://macroform.bandcamp.com/
 | 
			
		||||
 | 
			
		||||
manolo_camp-morning_coffee - Manolo Camp
 | 
			
		||||
beatbastard@gmx.net - http://ccmixter.org/people/ManoloCamp
 | 
			
		||||
 | 
			
		||||
reno_project-system - Reno Project
 | 
			
		||||
renoproject@hotmail.com - http://www.jamendo.com/en/album/23661
 | 
			
		||||
							
								
								
									
										36
									
								
								acl.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										36
									
								
								acl.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -242,20 +242,19 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
 | 
			
		||||
 | 
			
		||||
	memset(&m_rtmsg, 0, sizeof(m_rtmsg));
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_type = RTM_GET;
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_flags = RTF_UP | RTF_HOST;
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_version = RTM_VERSION;
 | 
			
		||||
	ast_mutex_lock(&routeseq_lock);
 | 
			
		||||
	seq = ++routeseq;
 | 
			
		||||
	ast_mutex_unlock(&routeseq_lock);
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_seq = seq;
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_addrs = RTA_IFA | RTA_DST;
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_addrs = RTA_DST | RTA_IFA;
 | 
			
		||||
	m_rtmsg.m_rtm.rtm_msglen = sizeof(struct rt_msghdr) + sizeof(struct sockaddr_in);
 | 
			
		||||
	sin = (struct sockaddr_in *)m_rtmsg.m_space;
 | 
			
		||||
	sin->sin_family = AF_INET;
 | 
			
		||||
	sin->sin_len = sizeof(struct sockaddr_in);
 | 
			
		||||
	sin->sin_addr = *them;
 | 
			
		||||
 | 
			
		||||
	if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) {
 | 
			
		||||
	if ((s = socket(PF_ROUTE, SOCK_RAW, AF_UNSPEC)) < 0) {
 | 
			
		||||
		ast_log(LOG_ERROR, "Error opening routing socket\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
@@ -268,7 +267,7 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
 | 
			
		||||
	}
 | 
			
		||||
	do {
 | 
			
		||||
		l = read(s, (char *)&m_rtmsg, sizeof(m_rtmsg));
 | 
			
		||||
	} while (l > 0 && (m_rtmsg.m_rtm.rtm_seq != 1 || m_rtmsg.m_rtm.rtm_pid != pid));
 | 
			
		||||
	} while (l > 0 && (m_rtmsg.m_rtm.rtm_seq != seq || m_rtmsg.m_rtm.rtm_pid != pid));
 | 
			
		||||
	if (l < 0) {
 | 
			
		||||
		if (errno != EAGAIN)
 | 
			
		||||
			ast_log(LOG_ERROR, "Error reading from routing socket\n");
 | 
			
		||||
@@ -379,3 +378,32 @@ int ast_ouraddrfor(struct in_addr *them, struct in_addr *us)
 | 
			
		||||
	return 0;
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ast_find_ourip(struct in_addr *ourip, struct sockaddr_in bindaddr)
 | 
			
		||||
{
 | 
			
		||||
	char ourhost[MAXHOSTNAMELEN]="";
 | 
			
		||||
	struct ast_hostent ahp;
 | 
			
		||||
	struct hostent *hp;
 | 
			
		||||
	struct in_addr saddr;
 | 
			
		||||
 | 
			
		||||
	/* just use the bind address if it is nonzero */
 | 
			
		||||
	if (ntohl(bindaddr.sin_addr.s_addr)) {
 | 
			
		||||
		memcpy(ourip, &bindaddr.sin_addr, sizeof(*ourip));
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	/* try to use our hostname */
 | 
			
		||||
	if (gethostname(ourhost, sizeof(ourhost)-1)) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Unable to get hostname\n");
 | 
			
		||||
	} else {
 | 
			
		||||
		hp = ast_gethostbyname(ourhost, &ahp);
 | 
			
		||||
		if (hp) {
 | 
			
		||||
			memcpy(ourip, hp->h_addr, sizeof(*ourip));
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	/* A.ROOT-SERVERS.NET. */
 | 
			
		||||
	if (inet_aton("198.41.0.4", &saddr) && !ast_ouraddrfor(&saddr, ourip))
 | 
			
		||||
		return 0;
 | 
			
		||||
	return -1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								aescrypt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								aescrypt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										19
									
								
								aesopt.h
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										19
									
								
								aesopt.h
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -136,6 +136,7 @@
 | 
			
		||||
#define _AESOPT_H
 | 
			
		||||
 | 
			
		||||
#include <asterisk/aes.h>
 | 
			
		||||
#include "asterisk/endian.h"
 | 
			
		||||
 | 
			
		||||
/*  CONFIGURATION - USE OF DEFINES
 | 
			
		||||
 | 
			
		||||
@@ -146,24 +147,6 @@
 | 
			
		||||
    #if clauses.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*  PLATFORM SPECIFIC INCLUDES */
 | 
			
		||||
 | 
			
		||||
#if defined( __OpenBSD__ )
 | 
			
		||||
#  include <machine/types.h>
 | 
			
		||||
#  include <sys/endian.h>
 | 
			
		||||
#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
 | 
			
		||||
#  include <sys/types.h>
 | 
			
		||||
#  include <sys/endian.h>
 | 
			
		||||
#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
 | 
			
		||||
#  include <machine/endian.h>
 | 
			
		||||
#elif defined( __GNUC__ ) || defined( __GNU_LIBRARY__ )
 | 
			
		||||
#  include <endian.h>
 | 
			
		||||
#if !defined(__APPLE__)
 | 
			
		||||
#  include <byteswap.h>
 | 
			
		||||
#endif
 | 
			
		||||
#elif defined( linux )
 | 
			
		||||
#  include <endian.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/*  BYTE ORDER IN 32-BIT WORDS
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,3 +0,0 @@
 | 
			
		||||
eagi-test
 | 
			
		||||
eagi-sphinx-test
 | 
			
		||||
.depend
 | 
			
		||||
							
								
								
									
										0
									
								
								agi/DialAnMp3.agi
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/DialAnMp3.agi
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								agi/Makefile
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/Makefile
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								agi/agi-test.agi
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/agi-test.agi
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								agi/eagi-sphinx-test.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/eagi-sphinx-test.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								agi/eagi-test.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/eagi-test.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								agi/fastagi-test
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/fastagi-test
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								agi/numeralize
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								agi/numeralize
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										111
									
								
								app.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										111
									
								
								app.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -136,6 +136,13 @@ int ast_app_getvoice(struct ast_channel *c, char *dest, char *dstfmt, char *prom
 | 
			
		||||
					ast_frfree(f);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				res = ast_writestream(writer, f);
 | 
			
		||||
				if (res < 0) {
 | 
			
		||||
					ast_log(LOG_WARNING, "Failed to write to stream at %s!\n", dest);
 | 
			
		||||
					ast_frfree(f);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
					
 | 
			
		||||
			}
 | 
			
		||||
			ast_frfree(f);
 | 
			
		||||
		}
 | 
			
		||||
@@ -278,7 +285,7 @@ int ast_dtmf_stream(struct ast_channel *chan,struct ast_channel *peer,char *digi
 | 
			
		||||
	if (!res) {
 | 
			
		||||
		res = ast_waitfor(chan,100);
 | 
			
		||||
		if (res > -1) {
 | 
			
		||||
			for (ptr=digits;*ptr;*ptr++) {
 | 
			
		||||
			for (ptr=digits; *ptr; ptr++) {
 | 
			
		||||
				if (*ptr == 'w') {
 | 
			
		||||
					res = ast_safe_sleep(chan, 500);
 | 
			
		||||
					if (res) 
 | 
			
		||||
@@ -518,9 +525,10 @@ int ast_play_and_wait(struct ast_channel *chan, char *fn)
 | 
			
		||||
static int global_silence_threshold = 128;
 | 
			
		||||
static int global_maxsilence = 0;
 | 
			
		||||
 | 
			
		||||
int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int silencethreshold, int maxsilence)
 | 
			
		||||
int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int silencethreshold, int maxsilence, const char *path)
 | 
			
		||||
{
 | 
			
		||||
	char d, *fmts;
 | 
			
		||||
	int d;
 | 
			
		||||
	char *fmts;
 | 
			
		||||
	char comment[256];
 | 
			
		||||
	int x, fmtcnt=1, res=-1,outmsg=0;
 | 
			
		||||
	struct ast_frame *f;
 | 
			
		||||
@@ -528,7 +536,7 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
 | 
			
		||||
	char *sfmt[MAX_OTHER_FORMATS];
 | 
			
		||||
	char *stringp=NULL;
 | 
			
		||||
	time_t start, end;
 | 
			
		||||
	struct ast_dsp *sildet;   	/* silence detector dsp */
 | 
			
		||||
	struct ast_dsp *sildet=NULL;   	/* silence detector dsp */
 | 
			
		||||
	int totalsilence = 0;
 | 
			
		||||
	int dspsilence = 0;
 | 
			
		||||
	int gotsilence = 0;		/* did we timeout for silence? */
 | 
			
		||||
@@ -585,18 +593,22 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sildet = ast_dsp_new(); /* Create the silence detector */
 | 
			
		||||
	if (!sildet) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	ast_dsp_set_threshold(sildet, silencethreshold);
 | 
			
		||||
	if (path)
 | 
			
		||||
		ast_unlock_path(path);
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	if (maxsilence > 0) {
 | 
			
		||||
		sildet = ast_dsp_new(); /* Create the silence detector */
 | 
			
		||||
		if (!sildet) {
 | 
			
		||||
			ast_log(LOG_WARNING, "Unable to create silence detector :(\n");
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		ast_dsp_set_threshold(sildet, silencethreshold);
 | 
			
		||||
		rfmt = chan->readformat;
 | 
			
		||||
		res = ast_set_read_format(chan, AST_FORMAT_SLINEAR);
 | 
			
		||||
		if (res < 0) {
 | 
			
		||||
			ast_log(LOG_WARNING, "Unable to set to linear mode, giving up\n");
 | 
			
		||||
			ast_dsp_free(sildet);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
@@ -640,13 +652,13 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
 | 
			
		||||
						totalsilence = 0;
 | 
			
		||||
 | 
			
		||||
					if (totalsilence > maxsilence) {
 | 
			
		||||
					/* Ended happily with silence */
 | 
			
		||||
                                        if (option_verbose > 2)
 | 
			
		||||
                                                ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
 | 
			
		||||
					ast_frfree(f);
 | 
			
		||||
					gotsilence = 1;
 | 
			
		||||
					outmsg=2;
 | 
			
		||||
					break;
 | 
			
		||||
						/* Ended happily with silence */
 | 
			
		||||
                                        	if (option_verbose > 2)
 | 
			
		||||
                                                	ast_verbose( VERBOSE_PREFIX_3 "Recording automatically stopped after a silence of %d seconds\n", totalsilence/1000);
 | 
			
		||||
						ast_frfree(f);
 | 
			
		||||
						gotsilence = 1;
 | 
			
		||||
						outmsg=2;
 | 
			
		||||
						break;
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				/* Exit on any error */
 | 
			
		||||
@@ -706,10 +718,12 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
 | 
			
		||||
	for (x=0;x<fmtcnt;x++) {
 | 
			
		||||
		if (!others[x])
 | 
			
		||||
			break;
 | 
			
		||||
		if (totalsilence)
 | 
			
		||||
			ast_stream_rewind(others[x], totalsilence-200);
 | 
			
		||||
		else
 | 
			
		||||
			ast_stream_rewind(others[x], 200);
 | 
			
		||||
		if (res > 0) {
 | 
			
		||||
			if (totalsilence)
 | 
			
		||||
				ast_stream_rewind(others[x], totalsilence-200);
 | 
			
		||||
			else
 | 
			
		||||
				ast_stream_rewind(others[x], 200);
 | 
			
		||||
		}
 | 
			
		||||
		ast_truncstream(others[x]);
 | 
			
		||||
		ast_closestream(others[x]);
 | 
			
		||||
	}
 | 
			
		||||
@@ -718,20 +732,20 @@ int ast_play_and_record(struct ast_channel *chan, char *playfile, char *recordfi
 | 
			
		||||
			ast_log(LOG_WARNING, "Unable to restore format %s to channel '%s'\n", ast_getformatname(rfmt), chan->name);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (outmsg) {
 | 
			
		||||
		if (outmsg > 1) {
 | 
			
		||||
	if (outmsg > 1) {
 | 
			
		||||
		/* Let them know recording is stopped */
 | 
			
		||||
			ast_streamfile(chan, "auth-thankyou", chan->language);
 | 
			
		||||
		if(!ast_streamfile(chan, "auth-thankyou", chan->language))
 | 
			
		||||
			ast_waitstream(chan, "");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (sildet)
 | 
			
		||||
		ast_dsp_free(sildet);
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int *duration, int beep, int silencethreshold, int maxsilence)
 | 
			
		||||
{
 | 
			
		||||
	char d = 0, *fmts;
 | 
			
		||||
	int d = 0;
 | 
			
		||||
	char *fmts;
 | 
			
		||||
	char comment[256];
 | 
			
		||||
	int x, fmtcnt=1, res=-1,outmsg=0;
 | 
			
		||||
	struct ast_frame *f;
 | 
			
		||||
@@ -961,3 +975,46 @@ int ast_play_and_prepend(struct ast_channel *chan, char *playfile, char *recordf
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ast_lock_path(const char *path)
 | 
			
		||||
{
 | 
			
		||||
	char *s;
 | 
			
		||||
	char *fs;
 | 
			
		||||
	int res;
 | 
			
		||||
	int fd;
 | 
			
		||||
	time_t start;
 | 
			
		||||
	s = alloca(strlen(path) + 10);
 | 
			
		||||
	fs = alloca(strlen(path) + 20);
 | 
			
		||||
	if (!fs || !s) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Out of memory!\n");
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	snprintf(fs, strlen(path) + 19, "%s/%s-%08x", path, ".lock", rand());
 | 
			
		||||
	fd = open(fs, O_WRONLY | O_CREAT | O_EXCL, 0600);
 | 
			
		||||
	if (fd < 0) {
 | 
			
		||||
		fprintf(stderr, "Unable to create lock file: %s\n", strerror(errno));
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	close(fd);
 | 
			
		||||
	snprintf(s, strlen(path) + 9, "%s/%s", path, ".lock");
 | 
			
		||||
	time(&start);
 | 
			
		||||
	while (((res = link(fs, s)) < 0) && (errno == EEXIST) && (time(NULL) - start < 5))
 | 
			
		||||
		usleep(1);
 | 
			
		||||
	if (res < 0) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Failed to lock path '%s': %s\n", path, strerror(errno));
 | 
			
		||||
	}
 | 
			
		||||
	unlink(fs);
 | 
			
		||||
	ast_log(LOG_DEBUG, "Locked path '%s'\n", path);
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int ast_unlock_path(const char *path)
 | 
			
		||||
{
 | 
			
		||||
	char *s;
 | 
			
		||||
	s = alloca(strlen(path) + 10);
 | 
			
		||||
	if (!s)
 | 
			
		||||
		return -1;
 | 
			
		||||
	snprintf(s, strlen(path) + 9, "%s/%s", path, ".lock");
 | 
			
		||||
	ast_log(LOG_DEBUG, "Unlocked path '%s'\n", path);
 | 
			
		||||
	return unlink(s);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1 +0,0 @@
 | 
			
		||||
.depend
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/Makefile
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/Makefile
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_adsiprog.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_adsiprog.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										2
									
								
								apps/app_alarmreceiver.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										2
									
								
								apps/app_alarmreceiver.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -55,7 +55,7 @@ static char *tdesc = "Alarm Receiver for Asterisk";
 | 
			
		||||
 | 
			
		||||
static char *app = "AlarmReceiver";
 | 
			
		||||
 | 
			
		||||
static char *synopsis = "Provide support for receving alarm reports from a burglar or fire alarm panel\n";
 | 
			
		||||
static char *synopsis = "Provide support for receving alarm reports from a burglar or fire alarm panel";
 | 
			
		||||
static char *descrip =
 | 
			
		||||
"Alarm receiver application for Asterisk. Only 1 signalling format is supported at this time:\n"
 | 
			
		||||
"Ademco Contact ID. This application should be called whenever there is an alarm panel calling in\n"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_authenticate.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_authenticate.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_cdr.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_cdr.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										11
									
								
								apps/app_chanisavail.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										11
									
								
								apps/app_chanisavail.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -38,11 +38,12 @@ static char *descrip =
 | 
			
		||||
"Checks is any of the requested channels are available.  If none\n"
 | 
			
		||||
"of the requested channels are available the new priority will be\n"
 | 
			
		||||
"n+101 (unless such a priority does not exist or on error, in which\n"
 | 
			
		||||
"case ChanIsAvail will return -1).  If any of the requested channels\n"
 | 
			
		||||
"are available, the next priority will be n+1, the channel variable\n"
 | 
			
		||||
"${AVAILCHAN} will be set to the name of the available channel and\n"
 | 
			
		||||
"the ChanIsAvail app will return 0.  ${AVAILORIGCHAN} is\n"
 | 
			
		||||
"the canonical channel name that was used to create the channel.\n";
 | 
			
		||||
"case ChanIsAvail will return -1).\n"
 | 
			
		||||
"If any of the requested channels are available, the next priority will be n+1,\n"
 | 
			
		||||
"the channel variable ${AVAILCHAN} will be set to the name of the available channel\n"
 | 
			
		||||
"and the ChanIsAvail app will return 0.\n"
 | 
			
		||||
"${AVAILORIGCHAN} is the canonical channel name that was used to create the channel.\n"
 | 
			
		||||
"${AVAILSTATUS} is the status code for the channel.\n";
 | 
			
		||||
 | 
			
		||||
STANDARD_LOCAL_USER;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										15
									
								
								apps/app_controlplayback.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										15
									
								
								apps/app_controlplayback.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -64,24 +64,19 @@ static int controlplayback_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
	file = tmp;
 | 
			
		||||
 | 
			
		||||
	if ((skip=strchr(tmp,'|'))) {
 | 
			
		||||
		*skip = '\0';
 | 
			
		||||
		*skip++;
 | 
			
		||||
		*skip++ = '\0';
 | 
			
		||||
		fwd=strchr(skip,'|');
 | 
			
		||||
		if (fwd) {
 | 
			
		||||
			*fwd = '\0';
 | 
			
		||||
			*fwd++;
 | 
			
		||||
			*fwd++ = '\0';
 | 
			
		||||
			rev = strchr(fwd,'|');
 | 
			
		||||
			if (rev) {
 | 
			
		||||
				*rev = '\0';
 | 
			
		||||
				*rev++;
 | 
			
		||||
				*rev++ = '\0';
 | 
			
		||||
				stop = strchr(rev,'|');
 | 
			
		||||
				if (stop) {
 | 
			
		||||
					*stop = '\0';
 | 
			
		||||
					*stop++;
 | 
			
		||||
					*stop++ = '\0';
 | 
			
		||||
					pause = strchr(stop,'|');
 | 
			
		||||
					if (pause) {
 | 
			
		||||
						*pause = '\0';
 | 
			
		||||
						*pause++;
 | 
			
		||||
						*pause++ = '\0';
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								apps/app_cut.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										4
									
								
								apps/app_cut.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -31,10 +31,10 @@ static char *tdesc = "Cuts up variables";
 | 
			
		||||
 | 
			
		||||
static char *app_cut = "Cut";
 | 
			
		||||
 | 
			
		||||
static char *cut_synopsis = "Cut(newvar=varname|delimiter|fieldspec)";
 | 
			
		||||
static char *cut_synopsis = "Splits a variable's content using the specified delimiter";
 | 
			
		||||
 | 
			
		||||
static char *cut_descrip =
 | 
			
		||||
"Cut(newvar=varname,delimiter,field)\n"
 | 
			
		||||
"Usage: Cut(newvar=varname,delimiter,fieldspec)\n"
 | 
			
		||||
"  newvar    - new variable created from result string\n"
 | 
			
		||||
"  varname   - variable you want cut\n"
 | 
			
		||||
"  delimiter - defaults to '-'\n"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_datetime.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_datetime.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_db.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_db.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										42
									
								
								apps/app_dial.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										42
									
								
								apps/app_dial.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -113,6 +113,7 @@ struct localuser {
 | 
			
		||||
	int allowdisconnect_in;
 | 
			
		||||
	int allowdisconnect_out;
 | 
			
		||||
	int forcecallerid;
 | 
			
		||||
	int noforwardhtml;
 | 
			
		||||
	struct localuser *next;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
@@ -134,7 +135,7 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception
 | 
			
		||||
 | 
			
		||||
#define AST_MAX_WATCHERS 256
 | 
			
		||||
 | 
			
		||||
static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, int *sentringing, char *status, size_t statussize)
 | 
			
		||||
static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, int *noforwardhtml, int *sentringing, char *status, size_t statussize)
 | 
			
		||||
{
 | 
			
		||||
	struct localuser *o;
 | 
			
		||||
	int found;
 | 
			
		||||
@@ -207,6 +208,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
 | 
			
		||||
					*allowredir_out = o->allowredirect_out;
 | 
			
		||||
					*allowdisconnect_in = o->allowdisconnect_in;
 | 
			
		||||
					*allowdisconnect_out = o->allowdisconnect_out;
 | 
			
		||||
					*noforwardhtml = o->noforwardhtml;
 | 
			
		||||
				}
 | 
			
		||||
			} else if (o->chan && (o->chan == winner)) {
 | 
			
		||||
				if (!ast_strlen_zero(o->chan->call_forward)) {
 | 
			
		||||
@@ -301,6 +303,7 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
 | 
			
		||||
								*allowredir_out = o->allowredirect_out;
 | 
			
		||||
								*allowdisconnect_in = o->allowdisconnect_in;
 | 
			
		||||
								*allowdisconnect_out = o->allowdisconnect_out;
 | 
			
		||||
								*noforwardhtml = o->noforwardhtml;
 | 
			
		||||
							}
 | 
			
		||||
							break;
 | 
			
		||||
						case AST_CONTROL_BUSY:
 | 
			
		||||
@@ -336,13 +339,14 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
 | 
			
		||||
						case AST_CONTROL_PROGRESS:
 | 
			
		||||
							if (option_verbose > 2)
 | 
			
		||||
								ast_verbose ( VERBOSE_PREFIX_3 "%s is making progress passing it to %s\n", o->chan->name,in->name);
 | 
			
		||||
							ast_indicate(in, AST_CONTROL_PROGRESS);
 | 
			
		||||
							if (!outgoing->ringbackonly)
 | 
			
		||||
								ast_indicate(in, AST_CONTROL_PROGRESS);
 | 
			
		||||
							break;
 | 
			
		||||
						case AST_CONTROL_OFFHOOK:
 | 
			
		||||
							/* Ignore going off hook */
 | 
			
		||||
							break;
 | 
			
		||||
						case -1:
 | 
			
		||||
							if (!outgoing->ringbackonly && !outgoing->musiconhold) {
 | 
			
		||||
							if (!(outgoing->ringbackonly || outgoing->musiconhold)) {
 | 
			
		||||
								if (option_verbose > 2)
 | 
			
		||||
									ast_verbose( VERBOSE_PREFIX_3 "%s stopped sounds\n", o->chan->name);
 | 
			
		||||
								ast_indicate(in, -1);
 | 
			
		||||
@@ -360,7 +364,14 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
 | 
			
		||||
								!(outgoing->ringbackonly || outgoing->musiconhold)) {
 | 
			
		||||
						if (ast_write(in, f))
 | 
			
		||||
							ast_log(LOG_WARNING, "Unable to forward image\n");
 | 
			
		||||
					} else if (single && (f->frametype == AST_FRAME_TEXT) && 
 | 
			
		||||
								!(outgoing->ringbackonly || outgoing->musiconhold)) {
 | 
			
		||||
						if (ast_write(in, f))
 | 
			
		||||
							ast_log(LOG_WARNING, "Unable to text\n");
 | 
			
		||||
					} else if (single && (f->frametype == AST_FRAME_HTML) && !outgoing->noforwardhtml) {
 | 
			
		||||
						ast_channel_sendhtml(in, f->subclass, f->data, f->datalen);
 | 
			
		||||
					}
 | 
			
		||||
						
 | 
			
		||||
					ast_frfree(f);
 | 
			
		||||
				} else {
 | 
			
		||||
					in->hangupcause = o->chan->hangupcause;
 | 
			
		||||
@@ -383,6 +394,8 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
 | 
			
		||||
				/* Got hung up */
 | 
			
		||||
				*to=-1;
 | 
			
		||||
				strncpy(status, "CANCEL", statussize - 1);
 | 
			
		||||
				if (f)
 | 
			
		||||
					ast_frfree(f);
 | 
			
		||||
				return NULL;
 | 
			
		||||
			}
 | 
			
		||||
			if (f && (f->frametype == AST_FRAME_DTMF) && *allowdisconnect_out &&
 | 
			
		||||
@@ -391,13 +404,18 @@ static struct ast_channel *wait_for_answer(struct ast_channel *in, struct localu
 | 
			
		||||
				ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
 | 
			
		||||
				*to=0;
 | 
			
		||||
				strcpy(status, "CANCEL");
 | 
			
		||||
				ast_frfree(f);
 | 
			
		||||
				return NULL;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (single && f && (f->frametype == AST_FRAME_HTML) && !outgoing->noforwardhtml)
 | 
			
		||||
				ast_channel_sendhtml(outgoing->chan, f->subclass, f->data, f->datalen);
 | 
			
		||||
 | 
			
		||||
			if (single && ((f->frametype == AST_FRAME_VOICE) || (f->frametype == AST_FRAME_DTMF)))  {
 | 
			
		||||
				if (ast_write(outgoing->chan, f))
 | 
			
		||||
					ast_log(LOG_WARNING, "Unable to forward voice\n");
 | 
			
		||||
				ast_frfree(f);
 | 
			
		||||
			}
 | 
			
		||||
			ast_frfree(f);
 | 
			
		||||
		}
 | 
			
		||||
		if (!*to && (option_verbose > 2))
 | 
			
		||||
			ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig);
 | 
			
		||||
@@ -421,6 +439,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
	int allowredir_out=0;
 | 
			
		||||
	int allowdisconnect_in=0;
 | 
			
		||||
	int allowdisconnect_out=0;
 | 
			
		||||
	int noforwardhtml=0;
 | 
			
		||||
	int hasmacro = 0;
 | 
			
		||||
	int privacy=0;
 | 
			
		||||
	int announce=0;
 | 
			
		||||
@@ -726,6 +745,9 @@ static int dial_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
			if (strchr(transfer, 'f'))
 | 
			
		||||
				tmp->forcecallerid = 1;
 | 
			
		||||
			else	tmp->forcecallerid = 0;
 | 
			
		||||
			if (url)
 | 
			
		||||
				tmp->noforwardhtml = 1;
 | 
			
		||||
			else 	tmp->noforwardhtml = 0;
 | 
			
		||||
		}
 | 
			
		||||
		strncpy(numsubst, number, sizeof(numsubst)-1);
 | 
			
		||||
		/* If we're dialing by extension, look at the extension to know what to dial */
 | 
			
		||||
@@ -746,6 +768,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
			cur = rest;
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		pbx_builtin_setvar_helper(tmp->chan, "DIALEDPEERNUMBER", numsubst);
 | 
			
		||||
		if (!ast_strlen_zero(tmp->chan->call_forward)) {
 | 
			
		||||
			char tmpchan[256]="";
 | 
			
		||||
			char *stuff;
 | 
			
		||||
@@ -879,7 +902,7 @@ static int dial_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		strncpy(status, "CHANUNAVAIL", sizeof(status) - 1);
 | 
			
		||||
 | 
			
		||||
	time(&start_time);
 | 
			
		||||
	peer = wait_for_answer(chan, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &sentringing, status, sizeof(status));
 | 
			
		||||
	peer = wait_for_answer(chan, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &sentringing, &noforwardhtml, status, sizeof(status));
 | 
			
		||||
 | 
			
		||||
	if (!peer) {
 | 
			
		||||
		if (to) 
 | 
			
		||||
@@ -908,8 +931,11 @@ static int dial_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
			ast_cdr_setdestchan(chan->cdr, peer->name);
 | 
			
		||||
		if (peer->name)
 | 
			
		||||
			pbx_builtin_setvar_helper(chan, "DIALEDPEERNAME", peer->name);
 | 
			
		||||
		if (numsubst)
 | 
			
		||||
			pbx_builtin_setvar_helper(chan, "DIALEDPEERNUMBER", numsubst);
 | 
			
		||||
 | 
			
		||||
		number = pbx_builtin_getvar_helper(peer, "DIALEDPEERNUMBER");
 | 
			
		||||
		if (!number)
 | 
			
		||||
			number = numsubst;
 | 
			
		||||
		pbx_builtin_setvar_helper(chan, "DIALEDPEERNUMBER", number);
 | 
			
		||||
 		/* JDG: sendurl */
 | 
			
		||||
 		if( url && !ast_strlen_zero(url) && ast_channel_supports_html(peer) ) {
 | 
			
		||||
 			ast_log(LOG_DEBUG, "app_dial: sendurl=%s.\n", url);
 | 
			
		||||
@@ -1029,7 +1055,7 @@ out:
 | 
			
		||||
	
 | 
			
		||||
	LOCAL_USER_REMOVE(u);
 | 
			
		||||
	
 | 
			
		||||
	if((go_on>0) && (!chan->_softhangup))
 | 
			
		||||
	if((go_on>0) && (!chan->_softhangup) && (res != AST_PBX_KEEPALIVE))
 | 
			
		||||
	    res=0;
 | 
			
		||||
	    
 | 
			
		||||
	return res;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_directory.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_directory.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										22
									
								
								apps/app_disa.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										22
									
								
								apps/app_disa.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -22,6 +22,7 @@
 | 
			
		||||
#include <asterisk/module.h>
 | 
			
		||||
#include <asterisk/translate.h>
 | 
			
		||||
#include <asterisk/ulaw.h>
 | 
			
		||||
#include <asterisk/utils.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <stdio.h>
 | 
			
		||||
@@ -161,7 +162,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
 | 
			
		||||
	if (!strcasecmp(tmp, "no-password"))
 | 
			
		||||
	{;
 | 
			
		||||
		k = 1;
 | 
			
		||||
		k |= 1; /* We have the password */
 | 
			
		||||
		ast_log(LOG_DEBUG, "DISA no-password login success\n");
 | 
			
		||||
	}
 | 
			
		||||
	gettimeofday(&lastdigittime,NULL);
 | 
			
		||||
@@ -173,10 +174,10 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		gettimeofday(&now,NULL);
 | 
			
		||||
		  /* if outa time, give em reorder */
 | 
			
		||||
		if (ms_diff(&now,&lastdigittime) > 
 | 
			
		||||
		    ((k) ? digittimeout : firstdigittimeout))
 | 
			
		||||
		    ((k&2) ? digittimeout : firstdigittimeout))
 | 
			
		||||
		{
 | 
			
		||||
			ast_log(LOG_DEBUG,"DISA %s entry timeout on chan %s\n",
 | 
			
		||||
				((k) ? "extension" : "password"),chan->name);
 | 
			
		||||
				((k&1) ? "extension" : "password"),chan->name);
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		if ((res = ast_waitfor(chan, -1) < 0)) {
 | 
			
		||||
@@ -211,13 +212,15 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		j = f->subclass;  /* save digit */
 | 
			
		||||
		ast_frfree(f);
 | 
			
		||||
		if (i == 0) 
 | 
			
		||||
		{
 | 
			
		||||
			k|=2; /* We have the first digit */ 
 | 
			
		||||
			ast_playtones_stop(chan);
 | 
			
		||||
 | 
			
		||||
		}
 | 
			
		||||
		gettimeofday(&lastdigittime,NULL);
 | 
			
		||||
		  /* got a DTMF tone */
 | 
			
		||||
		if (i < AST_MAX_EXTENSION) /* if still valid number of digits */
 | 
			
		||||
		{
 | 
			
		||||
			if (!k) /* if in password state */
 | 
			
		||||
			if (!(k&1)) /* if in password state */
 | 
			
		||||
			{
 | 
			
		||||
				if (j == '#') /* end of password */
 | 
			
		||||
				{
 | 
			
		||||
@@ -268,7 +271,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
					ast_log(LOG_DEBUG,"DISA on chan %s password is good\n",chan->name);
 | 
			
		||||
					play_dialtone(chan);
 | 
			
		||||
 | 
			
		||||
					k = 1;
 | 
			
		||||
					k|=1; /* In number mode */
 | 
			
		||||
					i = 0;  /* re-set buffer pointer */
 | 
			
		||||
					exten[sizeof(acctcode)] = 0;
 | 
			
		||||
					strncpy(acctcode,exten, sizeof(acctcode) - 1);
 | 
			
		||||
@@ -280,7 +283,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
 | 
			
		||||
			exten[i++] = j;  /* save digit */
 | 
			
		||||
			exten[i] = 0;
 | 
			
		||||
			if (!k) continue; /* if getting password, continue doing it */
 | 
			
		||||
			if (!(k&1)) continue; /* if getting password, continue doing it */
 | 
			
		||||
			  /* if this exists */
 | 
			
		||||
 | 
			
		||||
			if (ast_ignore_pattern(ourcontext, exten)) {
 | 
			
		||||
@@ -299,7 +302,7 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (k && ast_exists_extension(chan,ourcontext,exten,1, chan->callerid))
 | 
			
		||||
	if ((k==3) && (ast_exists_extension(chan,ourcontext,exten,1, chan->callerid)))
 | 
			
		||||
	{
 | 
			
		||||
		ast_playtones_stop(chan);
 | 
			
		||||
		/* We're authenticated and have a valid extension */
 | 
			
		||||
@@ -310,7 +313,8 @@ static int disa_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		}
 | 
			
		||||
		strncpy(chan->exten, exten, sizeof(chan->exten) - 1);
 | 
			
		||||
		strncpy(chan->context, ourcontext, sizeof(chan->context) - 1);
 | 
			
		||||
		strncpy(chan->accountcode, acctcode, sizeof(chan->accountcode) - 1);
 | 
			
		||||
		if (!ast_strlen_zero(acctcode))
 | 
			
		||||
			strncpy(chan->accountcode, acctcode, sizeof(chan->accountcode) - 1);
 | 
			
		||||
		chan->priority = 0;
 | 
			
		||||
		ast_cdr_init(chan->cdr,chan);
 | 
			
		||||
		LOCAL_USER_REMOVE(u);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_echo.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_echo.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_enumlookup.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_enumlookup.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										4
									
								
								apps/app_eval.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										4
									
								
								apps/app_eval.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -31,10 +31,10 @@ static char *tdesc = "Reevaluates strings";
 | 
			
		||||
 | 
			
		||||
static char *app_eval = "Eval";
 | 
			
		||||
 | 
			
		||||
static char *eval_synopsis = "Eval(newvar=somestring)";
 | 
			
		||||
static char *eval_synopsis = "Evaluates a string";
 | 
			
		||||
 | 
			
		||||
static char *eval_descrip =
 | 
			
		||||
"Eval(newvar=somestring)\n"
 | 
			
		||||
"Usage: Eval(newvar=somestring)\n"
 | 
			
		||||
"  Normally Asterisk evaluates variables inline.  But what if you want to\n"
 | 
			
		||||
"store variable offsets in a database, to be evaluated later?  Eval is\n"
 | 
			
		||||
"the answer, by allowing a string to be evaluated twice in the dialplan,\n"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_exec.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_exec.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										7
									
								
								apps/app_festival.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										7
									
								
								apps/app_festival.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -131,7 +131,6 @@ static int send_waveform_to_fd(char *waveform, int length, int fd) {
 | 
			
		||||
#endif
 | 
			
		||||
	
 | 
			
		||||
	write(fd,waveform,length);
 | 
			
		||||
	write(fd,"a",1);
 | 
			
		||||
	close(fd);
 | 
			
		||||
	exit(0);
 | 
			
		||||
}
 | 
			
		||||
@@ -305,9 +304,9 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 | 
			
		||||
	if (!(festivalcommand = ast_variable_retrieve(cfg, "general", "festivalcommand"))) {
 | 
			
		||||
		festivalcommand = "(tts_textasterisk \"%s\" 'file)(quit)\n";
 | 
			
		||||
	}
 | 
			
		||||
	ast_destroy(cfg);
 | 
			
		||||
	if (!vdata || ast_strlen_zero(vdata)) {
 | 
			
		||||
		ast_log(LOG_WARNING, "festival requires an argument (text)\n");
 | 
			
		||||
		ast_destroy(cfg);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	strncpy(data, vdata, sizeof(data) - 1);
 | 
			
		||||
@@ -325,6 +324,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 | 
			
		||||
 | 
			
		||||
    	if (fd < 0) {
 | 
			
		||||
		ast_log(LOG_WARNING,"festival_client: can't get socket\n");
 | 
			
		||||
		ast_destroy(cfg);
 | 
			
		||||
        	return -1;
 | 
			
		||||
	}
 | 
			
		||||
        memset(&serv_addr, 0, sizeof(serv_addr));
 | 
			
		||||
@@ -333,6 +333,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 | 
			
		||||
	        serverhost = ast_gethostbyname(host, &ahp);
 | 
			
		||||
	        if (serverhost == (struct hostent *)0) {
 | 
			
		||||
        	    	ast_log(LOG_WARNING,"festival_client: gethostbyname failed\n");
 | 
			
		||||
			ast_destroy(cfg);
 | 
			
		||||
	            	return -1;
 | 
			
		||||
        	}
 | 
			
		||||
	        memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length);
 | 
			
		||||
@@ -342,6 +343,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 | 
			
		||||
 | 
			
		||||
	if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0) {
 | 
			
		||||
		ast_log(LOG_WARNING,"festival_client: connect to server failed\n");
 | 
			
		||||
		ast_destroy(cfg);
 | 
			
		||||
        	return -1;
 | 
			
		||||
    	}
 | 
			
		||||
    	
 | 
			
		||||
@@ -444,6 +446,7 @@ static int festival_exec(struct ast_channel *chan, void *vdata)
 | 
			
		||||
    		}
 | 
			
		||||
	} while (strcmp(ack,"OK\n") != 0);
 | 
			
		||||
	close(fd);
 | 
			
		||||
	ast_destroy(cfg);
 | 
			
		||||
	LOCAL_USER_REMOVE(u);                                                                                
 | 
			
		||||
	return res;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_flash.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_flash.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										8
									
								
								apps/app_forkcdr.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										8
									
								
								apps/app_forkcdr.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -20,10 +20,11 @@
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#include <pthread.h>
 | 
			
		||||
 | 
			
		||||
static char *tdesc = "Fork The CDR into 2 seperate entities.";
 | 
			
		||||
static char *tdesc = "Fork The CDR into 2 separate entities.";
 | 
			
		||||
static char *app = "ForkCDR";
 | 
			
		||||
static char *synopsis = 
 | 
			
		||||
"Forks the Call Data Record\n"
 | 
			
		||||
"Forks the Call Data Record";
 | 
			
		||||
static char *descrip = 
 | 
			
		||||
"  ForkCDR():  Causes the Call Data Record to fork an additional\n"
 | 
			
		||||
	"cdr record starting from the time of the fork call\n";
 | 
			
		||||
 | 
			
		||||
@@ -36,6 +37,7 @@ LOCAL_USER_DECL;
 | 
			
		||||
static void ast_cdr_clone(struct ast_cdr *cdr) {
 | 
			
		||||
	struct ast_cdr *newcdr = ast_cdr_alloc();
 | 
			
		||||
	memcpy(newcdr,cdr,sizeof(struct ast_cdr));
 | 
			
		||||
	newcdr->next = NULL;
 | 
			
		||||
	ast_cdr_append(cdr,newcdr);
 | 
			
		||||
	gettimeofday(&newcdr->start, NULL);
 | 
			
		||||
	memset(&newcdr->answer, 0, sizeof(newcdr->answer));
 | 
			
		||||
@@ -68,7 +70,7 @@ int unload_module(void)
 | 
			
		||||
 | 
			
		||||
int load_module(void)
 | 
			
		||||
{
 | 
			
		||||
	return ast_register_application(app, forkcdr_exec, synopsis, tdesc);
 | 
			
		||||
	return ast_register_application(app, forkcdr_exec, synopsis, descrip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *description(void)
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										10
									
								
								apps/app_getcpeid.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										10
									
								
								apps/app_getcpeid.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -3,9 +3,9 @@
 | 
			
		||||
 *
 | 
			
		||||
 * Execute arbitrary system commands
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (C) 1999, Mark Spencer
 | 
			
		||||
 * Copyright (C) 1999-2005, Digium
 | 
			
		||||
 *
 | 
			
		||||
 * Mark Spencer <markster@linux-support.net>
 | 
			
		||||
 * Mark Spencer <markster@digium.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software, distributed under the terms of
 | 
			
		||||
 * the GNU General Public License
 | 
			
		||||
@@ -31,9 +31,9 @@ static char *app = "GetCPEID";
 | 
			
		||||
static char *synopsis = "Get ADSI CPE ID";
 | 
			
		||||
 | 
			
		||||
static char *descrip =
 | 
			
		||||
"  GetCPEID: Obtains and displays CPE ID and other information in order to\n"
 | 
			
		||||
"properly setup zapata.conf for on-hook operations.  Returns -1 on hanup\n"
 | 
			
		||||
"only.";
 | 
			
		||||
"  GetCPEID: Obtains and displays ADSI CPE ID and other information in order\n"
 | 
			
		||||
"to properly setup zapata.conf for on-hook operations.\n"
 | 
			
		||||
"Returns -1 on hangup only.\n";
 | 
			
		||||
 | 
			
		||||
STANDARD_LOCAL_USER;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_groupcount.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_groupcount.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										30
									
								
								apps/app_hasnewvoicemail.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										30
									
								
								apps/app_hasnewvoicemail.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -38,6 +38,7 @@
 | 
			
		||||
#include <asterisk/pbx.h>
 | 
			
		||||
#include <asterisk/module.h>
 | 
			
		||||
#include <asterisk/lock.h>
 | 
			
		||||
#include <asterisk/utils.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
@@ -70,7 +71,7 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
{
 | 
			
		||||
	int res=0;
 | 
			
		||||
	struct localuser *u;
 | 
			
		||||
	char vmpath[256], *input, *varname = NULL, *vmbox, *vmfolder = "INBOX", *context = "default";
 | 
			
		||||
	char vmpath[256], *temps, *input, *varname = NULL, *vmbox, *vmfolder = "INBOX", *context = "default";
 | 
			
		||||
	DIR *vmdir;
 | 
			
		||||
	struct dirent *vment;
 | 
			
		||||
	int vmcount = 0;
 | 
			
		||||
@@ -83,21 +84,22 @@ static int hasvoicemail_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
 | 
			
		||||
	input = ast_strdupa((char *)data);
 | 
			
		||||
	if (input) {
 | 
			
		||||
		if ((vmbox = strsep(&input,":")))
 | 
			
		||||
			if ((vmfolder = strsep(&input,"|")))
 | 
			
		||||
		temps = input;
 | 
			
		||||
		if ((temps = strsep(&input, "|"))) {
 | 
			
		||||
			if (input && !ast_strlen_zero(input))
 | 
			
		||||
				varname = input;
 | 
			
		||||
			else
 | 
			
		||||
				vmfolder = input;
 | 
			
		||||
		else
 | 
			
		||||
			if ((vmbox = strsep(&input,"|")))
 | 
			
		||||
				varname = input;
 | 
			
		||||
			else
 | 
			
		||||
				vmbox = input;
 | 
			
		||||
 | 
			
		||||
		if (index(vmbox,'@')) {
 | 
			
		||||
			context = vmbox;
 | 
			
		||||
			vmbox = strsep(&context,"@");
 | 
			
		||||
			input = temps;
 | 
			
		||||
		}
 | 
			
		||||
		if ((temps = strsep(&input, ":"))) {
 | 
			
		||||
			if (input && !ast_strlen_zero(input))
 | 
			
		||||
				vmfolder = input;
 | 
			
		||||
			input = temps;
 | 
			
		||||
		}
 | 
			
		||||
		if ((vmbox = strsep(&input, "@")))
 | 
			
		||||
			if (input && !ast_strlen_zero(input))
 | 
			
		||||
				context = input;
 | 
			
		||||
		if (!vmbox)
 | 
			
		||||
			vmbox = input;
 | 
			
		||||
 | 
			
		||||
		snprintf(vmpath,sizeof(vmpath), "%s/voicemail/%s/%s/%s", (char *)ast_config_AST_SPOOL_DIR, context, vmbox, vmfolder);
 | 
			
		||||
		if (!(vmdir = opendir(vmpath))) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_ices.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_ices.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_image.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_image.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_intercom.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_intercom.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_lookupblacklist.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_lookupblacklist.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_lookupcidname.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_lookupcidname.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										3
									
								
								apps/app_macro.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										3
									
								
								apps/app_macro.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -140,7 +140,8 @@ static int macro_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
  while(ast_exists_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid)) {
 | 
			
		||||
	if ((res = ast_spawn_extension(chan, chan->context, chan->exten, chan->priority, chan->callerid))) {
 | 
			
		||||
		/* Something bad happened, or a hangup has been requested. */
 | 
			
		||||
		if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F'))) {
 | 
			
		||||
		if (((res >= '0') && (res <= '9')) || ((res >= 'A') && (res <= 'F')) ||
 | 
			
		||||
		    (res == '*') || (res == '#')) {
 | 
			
		||||
			/* Just return result as to the previous application as if it had been dialed */
 | 
			
		||||
			ast_log(LOG_DEBUG, "Oooh, got something to jump out with ('%c')!\n", res);
 | 
			
		||||
			break;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										83
									
								
								apps/app_meetme.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										83
									
								
								apps/app_meetme.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -482,9 +482,39 @@ static int confnonzero(void *ptr)
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Remove the conference from the list and free it.
 | 
			
		||||
   We assume that this was called while holding conflock. */
 | 
			
		||||
static int conf_free(struct ast_conference *conf)
 | 
			
		||||
{
 | 
			
		||||
	struct ast_conference *prev = NULL, *cur = confs;
 | 
			
		||||
 | 
			
		||||
	while(cur) {
 | 
			
		||||
		if (cur == conf) {
 | 
			
		||||
			if (prev)
 | 
			
		||||
				prev->next = conf->next;
 | 
			
		||||
			else
 | 
			
		||||
				confs = conf->next;
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
		prev = cur;
 | 
			
		||||
		cur = cur->next;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!cur)
 | 
			
		||||
		ast_log(LOG_WARNING, "Conference not found\n");
 | 
			
		||||
 | 
			
		||||
	if (conf->chan)
 | 
			
		||||
		ast_hangup(conf->chan);
 | 
			
		||||
	else
 | 
			
		||||
		close(conf->fd);
 | 
			
		||||
	
 | 
			
		||||
	free(conf);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int confflags)
 | 
			
		||||
{
 | 
			
		||||
	struct ast_conference *prev=NULL, *cur;
 | 
			
		||||
	struct ast_conf_user *user = malloc(sizeof(struct ast_conf_user));
 | 
			
		||||
	int fd;
 | 
			
		||||
	struct zt_confinfo ztc;
 | 
			
		||||
@@ -524,7 +554,9 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
 | 
			
		||||
	memset(user, 0, sizeof(struct ast_conf_user));
 | 
			
		||||
 | 
			
		||||
	user->user_no = 0; /* User number 0 means starting up user! (dead - not in the list!) */
 | 
			
		||||
	
 | 
			
		||||
 | 
			
		||||
	time(&user->jointime);
 | 
			
		||||
 | 
			
		||||
	if (conf->locked) {
 | 
			
		||||
		/* Sorry, but this confernce is locked! */	
 | 
			
		||||
		if (!ast_streamfile(chan, "conf-locked", chan->language))
 | 
			
		||||
@@ -557,7 +589,6 @@ static int conf_run(struct ast_channel *chan, struct ast_conference *conf, int c
 | 
			
		||||
			conf->lastuser = user;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	strncpy(user->usrvalue, "test", sizeof(user->usrvalue) - 1);
 | 
			
		||||
	user->chan = chan;
 | 
			
		||||
	user->userflags = confflags;
 | 
			
		||||
	user->adminflags = 0;
 | 
			
		||||
@@ -990,31 +1021,12 @@ outrun:
 | 
			
		||||
			"Meetme: %s\r\n"
 | 
			
		||||
			"Usernum: %i\r\n",
 | 
			
		||||
			chan->name, chan->uniqueid, conf->confno, user->user_no);
 | 
			
		||||
		prev = NULL;
 | 
			
		||||
		conf->users--;
 | 
			
		||||
		if (confflags & CONFFLAG_MARKEDUSER) 
 | 
			
		||||
			conf->markedusers--;
 | 
			
		||||
		cur = confs;
 | 
			
		||||
		if (!conf->users) {
 | 
			
		||||
			/* No more users -- close this one out */
 | 
			
		||||
			while(cur) {
 | 
			
		||||
				if (cur == conf) {
 | 
			
		||||
					if (prev)
 | 
			
		||||
						prev->next = conf->next;
 | 
			
		||||
					else
 | 
			
		||||
						confs = conf->next;
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				prev = cur;
 | 
			
		||||
				cur = cur->next;
 | 
			
		||||
			}
 | 
			
		||||
			if (!cur) 
 | 
			
		||||
				ast_log(LOG_WARNING, "Conference not found\n");
 | 
			
		||||
			if (conf->chan)
 | 
			
		||||
				ast_hangup(conf->chan);
 | 
			
		||||
			else
 | 
			
		||||
				close(conf->fd);
 | 
			
		||||
			free(conf);
 | 
			
		||||
			conf_free(conf);	
 | 
			
		||||
		} else {
 | 
			
		||||
			/* Remove the user struct */ 
 | 
			
		||||
			if (user == conf->firstuser) {
 | 
			
		||||
@@ -1043,10 +1055,10 @@ outrun:
 | 
			
		||||
				else
 | 
			
		||||
					ast_log(LOG_ERROR, "Bad! Bad! Bad! user->prevuser is NULL but we're not the beginning!\n");
 | 
			
		||||
			}
 | 
			
		||||
			/* Return the number of seconds the user was in the conf */
 | 
			
		||||
			snprintf(meetmesecs, sizeof(meetmesecs), "%i", (int) (user->jointime - time(NULL)));
 | 
			
		||||
			pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
 | 
			
		||||
		}
 | 
			
		||||
		/* Return the number of seconds the user was in the conf */
 | 
			
		||||
		snprintf(meetmesecs, sizeof(meetmesecs), "%i", (int) (time(NULL) - user->jointime));
 | 
			
		||||
		pbx_builtin_setvar_helper(chan, "MEETMESECS", meetmesecs);
 | 
			
		||||
	}
 | 
			
		||||
	free(user);
 | 
			
		||||
	ast_mutex_unlock(&conflock);
 | 
			
		||||
@@ -1298,7 +1310,7 @@ static int conf_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
									if (!found) {
 | 
			
		||||
										/* At this point, we have a confno_tmp (static conference) that is empty */
 | 
			
		||||
										if ((empty_no_pin && ((!stringp) || (stringp && (stringp[0] == '\0')))) || (!empty_no_pin)) {
 | 
			
		||||
										/* Case 1:  empty_no_pin and pin is nonexistant (NULL)
 | 
			
		||||
										/* Case 1:  empty_no_pin and pin is nonexistent (NULL)
 | 
			
		||||
										 * Case 2:  empty_no_pin and pin is blank (but not NULL)
 | 
			
		||||
										 * Case 3:  not empty_no_pin
 | 
			
		||||
										 */
 | 
			
		||||
@@ -1399,8 +1411,15 @@ static int conf_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
									confno[0] = '\0';
 | 
			
		||||
							}
 | 
			
		||||
						} else {
 | 
			
		||||
							/* failed when getting the pin */
 | 
			
		||||
							res = -1;
 | 
			
		||||
							allowretry = 0;
 | 
			
		||||
							/* see if we need to get rid of the conference */
 | 
			
		||||
							ast_mutex_lock(&conflock);
 | 
			
		||||
							if (!cnf->users) {
 | 
			
		||||
								conf_free(cnf);	
 | 
			
		||||
							}
 | 
			
		||||
							ast_mutex_unlock(&conflock);
 | 
			
		||||
							break;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
@@ -1419,8 +1438,9 @@ static int conf_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} while (allowretry);
 | 
			
		||||
	/* Do the conference */
 | 
			
		||||
	
 | 
			
		||||
	LOCAL_USER_REMOVE(u);
 | 
			
		||||
	
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1454,14 +1474,17 @@ static int admin_exec(struct ast_channel *chan, void *data) {
 | 
			
		||||
		command = strsep(¶ms, "|");
 | 
			
		||||
		caller = strsep(¶ms, "|");
 | 
			
		||||
		
 | 
			
		||||
		ast_mutex_lock(&conflock);
 | 
			
		||||
		if (!command) {
 | 
			
		||||
			ast_log(LOG_WARNING, "MeetmeAdmin requires a command!\n");
 | 
			
		||||
			ast_mutex_unlock(&conflock);
 | 
			
		||||
			return -1;
 | 
			
		||||
		}
 | 
			
		||||
		cnf = confs;
 | 
			
		||||
		while (cnf) {
 | 
			
		||||
			if (strcmp(cnf->confno, conf) == 0) 
 | 
			
		||||
				break;
 | 
			
		||||
			cnf = cnf->next;
 | 
			
		||||
		}
 | 
			
		||||
		ast_mutex_unlock(&conflock);
 | 
			
		||||
		
 | 
			
		||||
		if (caller)
 | 
			
		||||
			user = find_user(cnf, caller);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_milliwatt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_milliwatt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_mp3.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_mp3.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_nbscat.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_nbscat.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_osplookup.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_osplookup.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										4
									
								
								apps/app_parkandannounce.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										4
									
								
								apps/app_parkandannounce.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -41,7 +41,7 @@ static char *synopsis = "Park and Announce";
 | 
			
		||||
static char *descrip =
 | 
			
		||||
"  ParkAndAnnounce(announce:template|timeout|dial|[return_context]):\n"
 | 
			
		||||
"Park a call into the parkinglot and announce the call over the console.\n"
 | 
			
		||||
"announce template: colon seperated list of files to announce, the word PARKED\n"
 | 
			
		||||
"announce template: colon separated list of files to announce, the word PARKED\n"
 | 
			
		||||
"                   will be replaced by a say_digits of the ext the call is parked in\n"
 | 
			
		||||
"timeout: time in seconds before the call returns into the return context.\n"
 | 
			
		||||
"dial: The app_dial style resource to call to make the announcement. Console/dsp calls the console.\n"
 | 
			
		||||
@@ -94,7 +94,7 @@ static int parkandannounce_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
	}
 | 
			
		||||
	dial=strsep(&s, "|");
 | 
			
		||||
	if(!dial) {
 | 
			
		||||
		ast_log(LOG_WARNING, "PARK: A dial resouce must be specified i.e: Console/dsp or Zap/g1/5551212\n");
 | 
			
		||||
		ast_log(LOG_WARNING, "PARK: A dial resource must be specified i.e: Console/dsp or Zap/g1/5551212\n");
 | 
			
		||||
		free(orig_s);
 | 
			
		||||
		return -1;
 | 
			
		||||
	} else {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_playback.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_playback.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_privacy.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_privacy.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										2
									
								
								apps/app_qcall.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										2
									
								
								apps/app_qcall.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -317,7 +317,7 @@ static void *qcall_do(void *arg)
 | 
			
		||||
							extstr,context,channel->name);
 | 
			
		||||
					if (strlen(ident)) {
 | 
			
		||||
						strncat(ident,"-ok", sizeof(ident) - strlen(ident) - 1);
 | 
			
		||||
						/* if file existant, play it */
 | 
			
		||||
						/* if file existent, play it */
 | 
			
		||||
						if (!ast_streamfile(channel,ident,0))
 | 
			
		||||
						{
 | 
			
		||||
							ast_waitstream(channel,"");
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										113
									
								
								apps/app_queue.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										113
									
								
								apps/app_queue.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -96,7 +96,7 @@ static char *descrip =
 | 
			
		||||
"Queues an incoming call in a particular call queue as defined in queues.conf.\n"
 | 
			
		||||
"  This application returns -1 if the originating channel hangs up, or if the\n"
 | 
			
		||||
"call is bridged and  either of the parties in the bridge terminate the call.\n"
 | 
			
		||||
"Returns 0 if the queue is full, nonexistant, or has no members.\n"
 | 
			
		||||
"Returns 0 if the queue is full, nonexistent, or has no members.\n"
 | 
			
		||||
"The option string may contain zero or more of the following characters:\n"
 | 
			
		||||
"      't' -- allow the called user transfer the calling user\n"
 | 
			
		||||
"      'T' -- to allow the calling user to transfer the call.\n"
 | 
			
		||||
@@ -545,14 +545,17 @@ static void hanguptree(struct localuser *outgoing, struct ast_channel *exception
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
 | 
			
		||||
static int ring_entry(struct queue_ent *qe, struct localuser *tmp, int *busies)
 | 
			
		||||
{
 | 
			
		||||
	int res;
 | 
			
		||||
	struct ast_var_t *current, *newvar;
 | 
			
		||||
	struct varshead *headp, *newheadp;
 | 
			
		||||
	if (qe->parent->wrapuptime && (time(NULL) - tmp->lastcall < qe->parent->wrapuptime)) {
 | 
			
		||||
		ast_log(LOG_DEBUG, "Wrapuptime not yet expired for %s/%s\n", tmp->tech, tmp->numsubst);
 | 
			
		||||
		if (qe->chan->cdr)
 | 
			
		||||
			ast_cdr_busy(qe->chan->cdr);
 | 
			
		||||
		tmp->stillgoing = 0;
 | 
			
		||||
		(*busies)++;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	/* Request the peer */
 | 
			
		||||
@@ -564,8 +567,29 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
 | 
			
		||||
		if (qe->chan->cdr)
 | 
			
		||||
			ast_cdr_busy(qe->chan->cdr);
 | 
			
		||||
		tmp->stillgoing = 0;
 | 
			
		||||
		(*busies)++;
 | 
			
		||||
		return 0;
 | 
			
		||||
	}
 | 
			
		||||
	/* If creating a SIP channel, look for a variable called */
 | 
			
		||||
	/* VXML_URL in the calling channel and copy it to the    */
 | 
			
		||||
	/* new channel.                                          */
 | 
			
		||||
 | 
			
		||||
	/* Check for ALERT_INFO in the SetVar list.  This is for   */
 | 
			
		||||
	/* SIP distinctive ring as per the RFC.  For Cisco 7960s,  */
 | 
			
		||||
	/* SetVar(ALERT_INFO=<x>) where x is an integer value 1-5. */
 | 
			
		||||
	/* However, the RFC says it should be a URL.  -km-         */
 | 
			
		||||
	headp=&qe->chan->varshead;
 | 
			
		||||
	AST_LIST_TRAVERSE(headp,current,entries) {
 | 
			
		||||
		if (!strcasecmp(ast_var_name(current),"VXML_URL") ||
 | 
			
		||||
			!strcasecmp(ast_var_name(current), "ALERT_INFO") ||
 | 
			
		||||
			!strcasecmp(ast_var_name(current), "OSPTOKEN") ||
 | 
			
		||||
			!strcasecmp(ast_var_name(current), "OSPHANDLE"))
 | 
			
		||||
		{
 | 
			
		||||
			newvar=ast_var_assign(ast_var_name(current),ast_var_value(current));
 | 
			
		||||
			newheadp=&tmp->chan->varshead;
 | 
			
		||||
			AST_LIST_INSERT_HEAD(newheadp,newvar,entries);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	tmp->chan->appl = "AppQueue";
 | 
			
		||||
	tmp->chan->data = "(Outgoing Line)";
 | 
			
		||||
	tmp->chan->whentohangup = 0;
 | 
			
		||||
@@ -594,6 +618,7 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
 | 
			
		||||
		ast_hangup(tmp->chan);
 | 
			
		||||
		tmp->chan = NULL;
 | 
			
		||||
		tmp->stillgoing = 0;
 | 
			
		||||
		(*busies)++;
 | 
			
		||||
		return 0;
 | 
			
		||||
	} else {
 | 
			
		||||
		if (qe->parent->eventwhencalled) {
 | 
			
		||||
@@ -611,10 +636,10 @@ static int ring_entry(struct queue_ent *qe, struct localuser *tmp)
 | 
			
		||||
		if (option_verbose > 2)
 | 
			
		||||
			ast_verbose(VERBOSE_PREFIX_3 "Called %s/%s\n", tmp->tech, tmp->numsubst);
 | 
			
		||||
	}
 | 
			
		||||
	return 0;
 | 
			
		||||
	return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
 | 
			
		||||
static int ring_one(struct queue_ent *qe, struct localuser *outgoing, int *busies)
 | 
			
		||||
{
 | 
			
		||||
	struct localuser *cur;
 | 
			
		||||
	struct localuser *best;
 | 
			
		||||
@@ -636,9 +661,9 @@ static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
 | 
			
		||||
				/* Ring everyone who shares this best metric (for ringall) */
 | 
			
		||||
				cur = outgoing;
 | 
			
		||||
				while(cur) {
 | 
			
		||||
					if (cur->stillgoing && !cur->chan && (cur->metric == bestmetric)) {
 | 
			
		||||
					if (cur->stillgoing && !cur->chan && (cur->metric <= bestmetric)) {
 | 
			
		||||
						ast_log(LOG_DEBUG, "(Parallel) Trying '%s/%s' with metric %d\n", cur->tech, cur->numsubst, cur->metric);
 | 
			
		||||
						ring_entry(qe, cur);
 | 
			
		||||
						ring_entry(qe, cur, busies);
 | 
			
		||||
					}
 | 
			
		||||
					cur = cur->next;
 | 
			
		||||
				}
 | 
			
		||||
@@ -647,7 +672,7 @@ static int ring_one(struct queue_ent *qe, struct localuser *outgoing)
 | 
			
		||||
				if (option_debug)
 | 
			
		||||
					ast_log(LOG_DEBUG, "Trying '%s/%s' with metric %d\n", 
 | 
			
		||||
									best->tech, best->numsubst, best->metric);
 | 
			
		||||
				ring_entry(qe, best);
 | 
			
		||||
				ring_entry(qe, best, busies);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} while (best && !best->chan);
 | 
			
		||||
@@ -711,15 +736,36 @@ static int valid_exit(struct queue_ent *qe, char digit)
 | 
			
		||||
 | 
			
		||||
#define AST_MAX_WATCHERS 256
 | 
			
		||||
 | 
			
		||||
static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, char *digit)
 | 
			
		||||
#define BUILD_STATS do { \
 | 
			
		||||
		o = outgoing; \
 | 
			
		||||
		found = -1; \
 | 
			
		||||
		pos = 1; \
 | 
			
		||||
		numlines = 0; \
 | 
			
		||||
		watchers[0] = in; \
 | 
			
		||||
		while(o) { \
 | 
			
		||||
			/* Keep track of important channels */ \
 | 
			
		||||
			if (o->stillgoing) { \
 | 
			
		||||
				stillgoing = 1; \
 | 
			
		||||
				if (o->chan) { \
 | 
			
		||||
					watchers[pos++] = o->chan; \
 | 
			
		||||
					found = 1; \
 | 
			
		||||
				} \
 | 
			
		||||
			} \
 | 
			
		||||
			o = o->next; \
 | 
			
		||||
			numlines++; \
 | 
			
		||||
		} \
 | 
			
		||||
	} while(0)
 | 
			
		||||
 | 
			
		||||
static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser *outgoing, int *to, int *allowredir_in, int *allowredir_out, int *allowdisconnect_in, int *allowdisconnect_out, char *digit, int prebusies)
 | 
			
		||||
{
 | 
			
		||||
	char *queue = qe->parent->name;
 | 
			
		||||
	struct localuser *o;
 | 
			
		||||
	int found;
 | 
			
		||||
	int numlines;
 | 
			
		||||
	int sentringing = 0;
 | 
			
		||||
	int numbusies = 0;
 | 
			
		||||
	int numbusies = prebusies;
 | 
			
		||||
	int orig = *to;
 | 
			
		||||
	int stillgoing = 0;
 | 
			
		||||
	struct ast_frame *f;
 | 
			
		||||
	struct localuser *peer = NULL;
 | 
			
		||||
	struct ast_channel *watchers[AST_MAX_WATCHERS];
 | 
			
		||||
@@ -728,25 +774,18 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
 | 
			
		||||
	struct ast_channel *in = qe->chan;
 | 
			
		||||
	
 | 
			
		||||
	while(*to && !peer) {
 | 
			
		||||
		o = outgoing;
 | 
			
		||||
		found = -1;
 | 
			
		||||
		pos = 1;
 | 
			
		||||
		numlines = 0;
 | 
			
		||||
		watchers[0] = in;
 | 
			
		||||
		while(o) {
 | 
			
		||||
			/* Keep track of important channels */
 | 
			
		||||
			if (o->stillgoing && o->chan) {
 | 
			
		||||
				watchers[pos++] = o->chan;
 | 
			
		||||
				found = 1;
 | 
			
		||||
			}
 | 
			
		||||
			o = o->next;
 | 
			
		||||
			numlines++;
 | 
			
		||||
		BUILD_STATS;
 | 
			
		||||
		if ((found < 0) && stillgoing && !qe->parent->strategy) {
 | 
			
		||||
			/* On "ringall" strategy we only move to the next penalty level
 | 
			
		||||
			   when *all* ringing phones are done in the current penalty level */
 | 
			
		||||
			ring_one(qe, outgoing, &numbusies);
 | 
			
		||||
			BUILD_STATS;
 | 
			
		||||
		}
 | 
			
		||||
		if (found < 0) {
 | 
			
		||||
			if (numlines == numbusies) {
 | 
			
		||||
				ast_log(LOG_DEBUG, "Everyone is busy at this time\n");
 | 
			
		||||
			} else {
 | 
			
		||||
				ast_log(LOG_NOTICE, "No one is answering queue '%s'\n", queue);
 | 
			
		||||
				ast_log(LOG_NOTICE, "No one is answering queue '%s' (%d/%d)\n", queue, numlines, numbusies);
 | 
			
		||||
			}
 | 
			
		||||
			*to = 0;
 | 
			
		||||
			return NULL;
 | 
			
		||||
@@ -790,7 +829,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
 | 
			
		||||
							ast_hangup(o->chan);
 | 
			
		||||
							o->chan = NULL;
 | 
			
		||||
							if (qe->parent->strategy)
 | 
			
		||||
								ring_one(qe, outgoing);
 | 
			
		||||
								ring_one(qe, outgoing, &numbusies);
 | 
			
		||||
							numbusies++;
 | 
			
		||||
							break;
 | 
			
		||||
						case AST_CONTROL_CONGESTION:
 | 
			
		||||
@@ -802,7 +841,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
 | 
			
		||||
							ast_hangup(o->chan);
 | 
			
		||||
							o->chan = NULL;
 | 
			
		||||
							if (qe->parent->strategy)
 | 
			
		||||
								ring_one(qe, outgoing);
 | 
			
		||||
								ring_one(qe, outgoing, &numbusies);
 | 
			
		||||
							numbusies++;
 | 
			
		||||
							break;
 | 
			
		||||
						case AST_CONTROL_RINGING:
 | 
			
		||||
@@ -828,7 +867,7 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
 | 
			
		||||
					ast_hangup(o->chan);
 | 
			
		||||
					o->chan = NULL;
 | 
			
		||||
					if (qe->parent->strategy)
 | 
			
		||||
						ring_one(qe, outgoing);
 | 
			
		||||
						ring_one(qe, outgoing, &numbusies);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			o = o->next;
 | 
			
		||||
@@ -844,21 +883,26 @@ static struct localuser *wait_for_answer(struct queue_ent *qe, struct localuser
 | 
			
		||||
			if (!f || ((f->frametype == AST_FRAME_CONTROL) && (f->subclass == AST_CONTROL_HANGUP))) {
 | 
			
		||||
				/* Got hung up */
 | 
			
		||||
				*to=-1;
 | 
			
		||||
				if (f)
 | 
			
		||||
					ast_frfree(f);
 | 
			
		||||
				return NULL;
 | 
			
		||||
			}
 | 
			
		||||
			if (f && (f->frametype == AST_FRAME_DTMF) && allowdisconnect_out && (f->subclass == '*')) {
 | 
			
		||||
			if ((f->frametype == AST_FRAME_DTMF) && allowdisconnect_out && (f->subclass == '*')) {
 | 
			
		||||
			    if (option_verbose > 3)
 | 
			
		||||
					ast_verbose(VERBOSE_PREFIX_3 "User hit %c to disconnect call.\n", f->subclass);
 | 
			
		||||
				*to=0;
 | 
			
		||||
				ast_frfree(f);	
 | 
			
		||||
				return NULL;
 | 
			
		||||
			}
 | 
			
		||||
			if (f && (f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
 | 
			
		||||
			if ((f->frametype == AST_FRAME_DTMF) && (f->subclass != '*') && valid_exit(qe, f->subclass)) {
 | 
			
		||||
				if (option_verbose > 3)
 | 
			
		||||
					ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c", f->subclass);
 | 
			
		||||
					ast_verbose(VERBOSE_PREFIX_3 "User pressed digit: %c\n", f->subclass);
 | 
			
		||||
				*to=0;
 | 
			
		||||
				*digit=f->subclass;
 | 
			
		||||
				ast_frfree(f);
 | 
			
		||||
				return NULL;
 | 
			
		||||
			}
 | 
			
		||||
			ast_frfree(f);
 | 
			
		||||
		}
 | 
			
		||||
		if (!*to && (option_verbose > 2))
 | 
			
		||||
			ast_verbose( VERBOSE_PREFIX_3 "Nobody picked up in %d ms\n", orig);
 | 
			
		||||
@@ -1024,6 +1068,7 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
 | 
			
		||||
	struct member *member;
 | 
			
		||||
	int res = 0, bridge = 0;
 | 
			
		||||
	int zapx = 2;
 | 
			
		||||
	int numbusies = 0;
 | 
			
		||||
	int x=0;
 | 
			
		||||
	char *announce = NULL;
 | 
			
		||||
	char digit = 0;
 | 
			
		||||
@@ -1106,9 +1151,9 @@ static int try_calling(struct queue_ent *qe, char *options, char *announceoverri
 | 
			
		||||
		to = qe->parent->timeout * 1000;
 | 
			
		||||
	else
 | 
			
		||||
		to = -1;
 | 
			
		||||
	ring_one(qe, outgoing);
 | 
			
		||||
	ring_one(qe, outgoing, &numbusies);
 | 
			
		||||
	ast_mutex_unlock(&qe->parent->lock);
 | 
			
		||||
	lpeer = wait_for_answer(qe, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &digit);
 | 
			
		||||
	lpeer = wait_for_answer(qe, outgoing, &to, &allowredir_in, &allowredir_out, &allowdisconnect_in, &allowdisconnect_out, &digit, numbusies);
 | 
			
		||||
	ast_mutex_lock(&qe->parent->lock);
 | 
			
		||||
	if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
 | 
			
		||||
		store_next(qe, outgoing);
 | 
			
		||||
@@ -1638,6 +1683,7 @@ check_turns:
 | 
			
		||||
				/* Leave if we have exceeded our queuetimeout */
 | 
			
		||||
				if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
 | 
			
		||||
					res = 0;
 | 
			
		||||
					ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
@@ -1665,6 +1711,7 @@ check_turns:
 | 
			
		||||
				/* Leave if we have exceeded our queuetimeout */
 | 
			
		||||
				if (qe.queuetimeout && ( (time(NULL) - qe.start) >= qe.queuetimeout) ) {
 | 
			
		||||
					res = 0;
 | 
			
		||||
					ast_queue_log(queuename, chan->uniqueid, "NONE", "EXITWITHTIMEOUT", "%d", qe.pos);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
@@ -1704,7 +1751,7 @@ check_turns:
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		/* Don't allow return code > 0 */
 | 
			
		||||
		if (res > 0 && res != AST_PBX_KEEPALIVE) {
 | 
			
		||||
		if ((res == 0) || (res > 0 && res != AST_PBX_KEEPALIVE)) {
 | 
			
		||||
			res = 0;	
 | 
			
		||||
			if (ringing) {
 | 
			
		||||
				ast_indicate(chan, -1);
 | 
			
		||||
@@ -1831,7 +1878,7 @@ static void reload_queues(void)
 | 
			
		||||
								q->members = cur;
 | 
			
		||||
							prev = cur;
 | 
			
		||||
						}
 | 
			
		||||
					} else if (!strcasecmp(var->name, "music")) {
 | 
			
		||||
					} else if (!strcasecmp(var->name, "music") || !strcasecmp(var->name, "musiconhold")) {
 | 
			
		||||
						strncpy(q->moh, var->value, sizeof(q->moh) - 1);
 | 
			
		||||
					} else if (!strcasecmp(var->name, "announce")) {
 | 
			
		||||
						strncpy(q->announce, var->value, sizeof(q->announce) - 1);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								apps/app_random.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										1
									
								
								apps/app_random.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -106,7 +106,6 @@ int unload_module(void)
 | 
			
		||||
 | 
			
		||||
int load_module(void)
 | 
			
		||||
{
 | 
			
		||||
	srandom((unsigned int)getpid() + (unsigned int)time(NULL));
 | 
			
		||||
	return ast_register_application(app_random, random_exec, random_synopsis, random_descrip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								apps/app_read.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										3
									
								
								apps/app_read.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -106,8 +106,9 @@ static int read_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		if (res > -1) {
 | 
			
		||||
			pbx_builtin_setvar_helper(chan, varname, tmp);
 | 
			
		||||
			ast_verbose(VERBOSE_PREFIX_3 "User entered '%s'\n", tmp);
 | 
			
		||||
			res = 0;
 | 
			
		||||
		} else {
 | 
			
		||||
			ast_verbose(VERBOSE_PREFIX_3 "User entered nothing\n");
 | 
			
		||||
			ast_verbose(VERBOSE_PREFIX_3 "User disconnected\n");
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	LOCAL_USER_REMOVE(u);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								apps/app_record.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										2
									
								
								apps/app_record.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -301,7 +301,7 @@ static int record_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
		ast_log(LOG_WARNING, "Could not answer channel '%s'\n", chan->name);
 | 
			
		||||
 | 
			
		||||
	LOCAL_USER_REMOVE(u);
 | 
			
		||||
	if (silence > 0) {
 | 
			
		||||
	if ((silence > 0) && rfmt) {
 | 
			
		||||
	        res = ast_set_read_format(chan, rfmt);
 | 
			
		||||
        	if (res)
 | 
			
		||||
        	        ast_log(LOG_WARNING, "Unable to restore read format on '%s'\n", chan->name);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_rpt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_rpt.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_sayunixtime.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_sayunixtime.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_senddtmf.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_senddtmf.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_sendtext.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_sendtext.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_setcallerid.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_setcallerid.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_setcdruserfield.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_setcdruserfield.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_setcidname.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_setcidname.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_setcidnum.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_setcidnum.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_skel.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_skel.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										14
									
								
								apps/app_sms.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										14
									
								
								apps/app_sms.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -24,8 +24,10 @@
 | 
			
		||||
#include <unistd.h>
 | 
			
		||||
#include <errno.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <sys/stat.h>
 | 
			
		||||
#include <dirent.h>
 | 
			
		||||
#include <ctype.h>
 | 
			
		||||
#include "../astconf.h"
 | 
			
		||||
 | 
			
		||||
/* ToDo */
 | 
			
		||||
/* When acting as SC and answering, should check for messages and send instead of sending EST as first packet */
 | 
			
		||||
@@ -36,6 +38,9 @@
 | 
			
		||||
 | 
			
		||||
static unsigned char message_ref;	/* arbitary message ref */
 | 
			
		||||
 | 
			
		||||
static char log_file[255];
 | 
			
		||||
static char spool_dir[255];
 | 
			
		||||
 | 
			
		||||
static char *tdesc = "SMS/PSTN handler";
 | 
			
		||||
 | 
			
		||||
static char *app = "SMS";
 | 
			
		||||
@@ -315,7 +320,7 @@ sms_log (sms_t * h, char status)
 | 
			
		||||
{				/* log the output, and remove file */
 | 
			
		||||
  if (*h->oa || *h->da)
 | 
			
		||||
    {
 | 
			
		||||
      int o = open ("/var/log/asterisk/sms", O_CREAT | O_APPEND | O_WRONLY, 0666);
 | 
			
		||||
      int o = open (log_file, O_CREAT | O_APPEND | O_WRONLY, 0666);
 | 
			
		||||
      if (o >= 0)
 | 
			
		||||
	{
 | 
			
		||||
	  char line[1000], *p;
 | 
			
		||||
@@ -517,7 +522,7 @@ sms_writefile (sms_t * h)
 | 
			
		||||
	char fn2[200] = "";
 | 
			
		||||
	FILE *o;
 | 
			
		||||
 | 
			
		||||
	strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
 | 
			
		||||
	strncpy(fn, spool_dir, sizeof(fn) - 1);
 | 
			
		||||
	mkdir (fn, 0777);		/* ensure it exists */
 | 
			
		||||
	snprintf(fn + strlen(fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "me-sc" : "sc-me", h->queue);
 | 
			
		||||
	mkdir (fn, 0777);		/* ensure it exists */
 | 
			
		||||
@@ -689,7 +694,7 @@ sms_nextoutgoing (sms_t * h)
 | 
			
		||||
  DIR *d;
 | 
			
		||||
  char more = 0;
 | 
			
		||||
 | 
			
		||||
  strncpy(fn, "/var/spool/asterisk/sms", sizeof(fn) - 1);
 | 
			
		||||
  strncpy(fn, spool_dir, sizeof(fn) - 1);
 | 
			
		||||
  mkdir(fn, 0777);		/* ensure it exists */
 | 
			
		||||
  snprintf(fn + strlen (fn), sizeof(fn) - strlen(fn), "/%s.%s", h->smsc ? "sc-me" : "me-sc", h->queue);
 | 
			
		||||
  mkdir (fn, 0777);		/* ensure it exists */
 | 
			
		||||
@@ -769,6 +774,7 @@ sms_nextoutgoing (sms_t * h)
 | 
			
		||||
    {				/* no message */
 | 
			
		||||
      h->omsg[0] = 0x94;	/* SMS_REL */
 | 
			
		||||
      h->omsg[1] = 0;
 | 
			
		||||
      h->hangup = 1;
 | 
			
		||||
      sms_messagetx (h);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -1204,6 +1210,8 @@ load_module (void)
 | 
			
		||||
    for (p = 0; p < 128; p++)
 | 
			
		||||
      sms8to7[sms7to8[p]] = p;
 | 
			
		||||
  }
 | 
			
		||||
  snprintf(log_file, sizeof(log_file), "%s/sms", ast_config_AST_LOG_DIR);
 | 
			
		||||
  snprintf(spool_dir, sizeof(spool_dir), "%s/sms", ast_config_AST_SPOOL_DIR);
 | 
			
		||||
  return ast_register_application (app, sms_exec, synopsis, descrip);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_softhangup.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_softhangup.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										2
									
								
								apps/app_sql_postgres.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										2
									
								
								apps/app_sql_postgres.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -106,8 +106,6 @@ STANDARD_LOCAL_USER;
 | 
			
		||||
 | 
			
		||||
LOCAL_USER_DECL;
 | 
			
		||||
 | 
			
		||||
extern void pbx_builtin_setvar_helper(struct ast_channel *chan, char *name, char *value); 
 | 
			
		||||
 | 
			
		||||
#define AST_PGSQL_ID_DUMMY 0
 | 
			
		||||
#define AST_PGSQL_ID_CONNID 1
 | 
			
		||||
#define AST_PGSQL_ID_RESID 2
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_striplsd.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_striplsd.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_substring.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_substring.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_system.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_system.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_talkdetect.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_talkdetect.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										13
									
								
								apps/app_test.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										13
									
								
								apps/app_test.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -1,7 +1,7 @@
 | 
			
		||||
/*
 | 
			
		||||
 * Asterisk -- A telephony toolkit for Linux.
 | 
			
		||||
 *
 | 
			
		||||
 * Applictions connected with CDR engine
 | 
			
		||||
 * Applications to test connection and produce report in text file
 | 
			
		||||
 * 
 | 
			
		||||
 * Copyright (C) 2004, Digium, Inc.
 | 
			
		||||
 *
 | 
			
		||||
@@ -14,6 +14,7 @@
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
#include <asterisk/channel.h>
 | 
			
		||||
#include <asterisk/options.h>
 | 
			
		||||
#include <asterisk/module.h>
 | 
			
		||||
#include <asterisk/logger.h>
 | 
			
		||||
#include <asterisk/lock.h>
 | 
			
		||||
@@ -29,13 +30,15 @@
 | 
			
		||||
 | 
			
		||||
static char *tdesc = "Interface Test Application";
 | 
			
		||||
 | 
			
		||||
static char *tests_descrip = "TestServer(): Perform test server function and write call report"
 | 
			
		||||
							 "Results stored in /var/log/asterisk/testreports/<testid>.txt";
 | 
			
		||||
static char *tests_descrip = 
 | 
			
		||||
	 "TestServer(): Perform test server function and write call report.\n"
 | 
			
		||||
	 "Results stored in /var/log/asterisk/testreports/<testid>-server.txt";
 | 
			
		||||
static char *tests_app = "TestServer";
 | 
			
		||||
static char *tests_synopsis = "Execute Interface Test Server";
 | 
			
		||||
 | 
			
		||||
static char *testc_descrip = "TestClient(testid): Executes test client with given testid.\n"
 | 
			
		||||
							 "Results stored in /var/log/asterisk/testreports/<testid>.txt";
 | 
			
		||||
static char *testc_descrip = 
 | 
			
		||||
	 "TestClient(testid): Executes test client with given testid.\n"
 | 
			
		||||
	 "Results stored in /var/log/asterisk/testreports/<testid>-client.txt";
 | 
			
		||||
 | 
			
		||||
static char *testc_app = "TestClient";
 | 
			
		||||
static char *testc_synopsis = "Execute Interface Test Client";
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_transfer.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_transfer.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_txtcidname.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_txtcidname.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_url.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_url.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										6
									
								
								apps/app_userevent.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										6
									
								
								apps/app_userevent.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -54,22 +54,22 @@ static int userevent_exec(struct ast_channel *chan, void *data)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	strncpy(info, (char *)data, strlen((char *)data) + AST_MAX_EXTENSION-1);
 | 
			
		||||
	snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
 | 
			
		||||
	eventbody = strchr(eventname, '|');
 | 
			
		||||
	if (eventbody) {
 | 
			
		||||
		*eventbody = '\0';
 | 
			
		||||
		eventbody++;
 | 
			
		||||
	}
 | 
			
		||||
	snprintf(eventname, sizeof(eventname), "UserEvent%s", info);
 | 
			
		||||
	LOCAL_USER_ADD(u);
 | 
			
		||||
 | 
			
		||||
	if(eventbody) {
 | 
			
		||||
            ast_log(LOG_DEBUG, "Sending user event: %s, %s\n", eventname, eventbody);
 | 
			
		||||
            manager_event(EVENT_FLAG_CALL, eventname, 
 | 
			
		||||
            manager_event(EVENT_FLAG_USER, eventname, 
 | 
			
		||||
			"Channel: %s\r\nUniqueid: %s\r\n%s\r\n",
 | 
			
		||||
			chan->name, chan->uniqueid, eventbody);
 | 
			
		||||
	} else {
 | 
			
		||||
            ast_log(LOG_DEBUG, "Sending user event: %s\n", eventname);
 | 
			
		||||
            manager_event(EVENT_FLAG_CALL, eventname, 
 | 
			
		||||
            manager_event(EVENT_FLAG_USER, eventname, 
 | 
			
		||||
			"Channel: %s\r\nUniqueid: %s\r\n", chan->name, chan->uniqueid);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_verbose.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_verbose.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										437
									
								
								apps/app_voicemail.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										437
									
								
								apps/app_voicemail.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -176,8 +176,9 @@ struct vm_state {
 | 
			
		||||
};
 | 
			
		||||
static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct vm_state *vms, int msg, int option);
 | 
			
		||||
static int dialout(struct ast_channel *chan, struct ast_vm_user *vmu, char *num, char *outgoing_context);
 | 
			
		||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration);
 | 
			
		||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir);
 | 
			
		||||
static int vm_delete(char *file);
 | 
			
		||||
static int vm_play_folder_name(struct ast_channel *chan, char *mbox);
 | 
			
		||||
 | 
			
		||||
static char ext_pass_cmd[128];
 | 
			
		||||
 | 
			
		||||
@@ -674,7 +675,7 @@ static void vm_change_password(struct ast_vm_user *vmu, char *newpassword)
 | 
			
		||||
					}
 | 
			
		||||
				} else {
 | 
			
		||||
					/* Put it back like it was */
 | 
			
		||||
					fprintf(configout, orig);
 | 
			
		||||
					fprintf(configout, "%s", orig);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
        }
 | 
			
		||||
@@ -695,7 +696,8 @@ static void vm_change_password_shell(struct ast_vm_user *vmu, char *newpassword)
 | 
			
		||||
{
 | 
			
		||||
	char buf[255];
 | 
			
		||||
	snprintf(buf,255,"%s %s %s %s",ext_pass_cmd,vmu->context,vmu->mailbox,newpassword);
 | 
			
		||||
	ast_safe_system(buf);
 | 
			
		||||
	if (!ast_safe_system(buf))
 | 
			
		||||
		strncpy(vmu->password, newpassword, sizeof(vmu->password) - 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int make_dir(char *dest, int len, char *context, char *ext, char *mailbox)
 | 
			
		||||
@@ -708,6 +710,20 @@ static int make_file(char *dest, int len, char *dir, int num)
 | 
			
		||||
	return snprintf(dest, len, "%s/msg%04d", dir, num);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int last_message_index(char *dir)
 | 
			
		||||
{
 | 
			
		||||
        int x;
 | 
			
		||||
        char fn[256];
 | 
			
		||||
        ast_lock_path(dir);
 | 
			
		||||
	for (x=0;x<MAXMSG;x++) {
 | 
			
		||||
                make_file(fn, sizeof(fn), dir, x);
 | 
			
		||||
                if (ast_fileexists(fn, NULL, NULL) < 1)
 | 
			
		||||
                        break;
 | 
			
		||||
        }
 | 
			
		||||
	ast_unlock_path(dir);
 | 
			
		||||
        return x-1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int
 | 
			
		||||
inbuf(struct baseio *bio, FILE *fi)
 | 
			
		||||
{
 | 
			
		||||
@@ -847,7 +863,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
 | 
			
		||||
	FILE *p=NULL;
 | 
			
		||||
	int pfd;
 | 
			
		||||
	char date[256];
 | 
			
		||||
	char host[256];
 | 
			
		||||
	char host[MAXHOSTNAMELEN] = "";
 | 
			
		||||
	char who[256];
 | 
			
		||||
	char bound[256];
 | 
			
		||||
	char fname[256];
 | 
			
		||||
@@ -875,7 +891,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (p) {
 | 
			
		||||
		gethostname(host, sizeof(host));
 | 
			
		||||
		gethostname(host, sizeof(host)-1);
 | 
			
		||||
		if (strchr(srcemail, '@'))
 | 
			
		||||
			strncpy(who, srcemail, sizeof(who)-1);
 | 
			
		||||
		else {
 | 
			
		||||
@@ -992,7 +1008,7 @@ static int sendmail(char *srcemail, struct ast_vm_user *vmu, int msgnum, char *m
 | 
			
		||||
		fclose(p);
 | 
			
		||||
		snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
 | 
			
		||||
		ast_safe_system(tmp2);
 | 
			
		||||
		ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", who, mailcmd);
 | 
			
		||||
		ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", vmu->email, mailcmd);
 | 
			
		||||
	} else {
 | 
			
		||||
		ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
 | 
			
		||||
		return -1;
 | 
			
		||||
@@ -1005,7 +1021,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
 | 
			
		||||
	FILE *p=NULL;
 | 
			
		||||
	int pfd;
 | 
			
		||||
	char date[256];
 | 
			
		||||
	char host[256];
 | 
			
		||||
	char host[MAXHOSTNAMELEN]="";
 | 
			
		||||
	char who[256];
 | 
			
		||||
	char dur[256];
 | 
			
		||||
	char tmp[80] = "/tmp/astmail-XXXXXX";
 | 
			
		||||
@@ -1024,7 +1040,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (p) {
 | 
			
		||||
		gethostname(host, sizeof(host));
 | 
			
		||||
		gethostname(host, sizeof(host)-1);
 | 
			
		||||
		if (strchr(srcemail, '@'))
 | 
			
		||||
			strncpy(who, srcemail, sizeof(who)-1);
 | 
			
		||||
		else {
 | 
			
		||||
@@ -1079,7 +1095,7 @@ static int sendpage(char *srcemail, char *pager, int msgnum, char *mailbox, char
 | 
			
		||||
		fclose(p);
 | 
			
		||||
		snprintf(tmp2, sizeof(tmp2), "( %s < %s ; rm -f %s ) &", mailcmd, tmp, tmp);
 | 
			
		||||
		ast_safe_system(tmp2);
 | 
			
		||||
		ast_log(LOG_DEBUG, "Sent mail to %s with command '%s'\n", who, mailcmd);
 | 
			
		||||
		ast_log(LOG_DEBUG, "Sent page to %s with command '%s'\n", pager, mailcmd);
 | 
			
		||||
	} else {
 | 
			
		||||
		ast_log(LOG_WARNING, "Unable to launch '%s'\n", mailcmd);
 | 
			
		||||
		return -1;
 | 
			
		||||
@@ -1242,6 +1258,7 @@ static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int
 | 
			
		||||
 | 
			
		||||
	make_dir(fromdir, sizeof(fromdir), vmu->context, vmu->mailbox, frombox);
 | 
			
		||||
	make_file(frompath, sizeof(frompath), fromdir, msgnum);
 | 
			
		||||
	ast_lock_path(topath);
 | 
			
		||||
	recipmsgnum = 0;
 | 
			
		||||
	do {
 | 
			
		||||
		make_file(topath, sizeof(topath), todir, recipmsgnum);
 | 
			
		||||
@@ -1258,7 +1275,7 @@ static void copy_message(struct ast_channel *chan, struct ast_vm_user *vmu, int
 | 
			
		||||
	} else {
 | 
			
		||||
		ast_log(LOG_ERROR, "Recipient mailbox %s@%s is full\n", recip->mailbox, recip->context);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ast_unlock_path(topath);
 | 
			
		||||
	notify_new_message(chan, recip, recipmsgnum, duration, fmt, chan->callerid);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -1285,7 +1302,6 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
 | 
			
		||||
	FILE *txt;
 | 
			
		||||
	int res = 0;
 | 
			
		||||
	int msgnum;
 | 
			
		||||
	int fd;
 | 
			
		||||
	int duration = 0;
 | 
			
		||||
	int ausemacro = 0;
 | 
			
		||||
	int ousemacro = 0;
 | 
			
		||||
@@ -1359,7 +1375,7 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
 | 
			
		||||
			strncat(ecodes, "*", sizeof(ecodes) -  strlen(ecodes) - 1);
 | 
			
		||||
			ausemacro = 1;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		
 | 
			
		||||
		/* Play the beginning intro if desired */
 | 
			
		||||
		if (!ast_strlen_zero(prefile)) {
 | 
			
		||||
			if (ast_fileexists(prefile, NULL, NULL) > 0) {
 | 
			
		||||
@@ -1406,22 +1422,22 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
 | 
			
		||||
		}
 | 
			
		||||
		/* Check for a '0' here */
 | 
			
		||||
		if (res == '0') {
 | 
			
		||||
		transfer:
 | 
			
		||||
			strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
 | 
			
		||||
			if (!ast_strlen_zero(vmu->exit)) {
 | 
			
		||||
				strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
 | 
			
		||||
			} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
 | 
			
		||||
				strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
 | 
			
		||||
			transfer:
 | 
			
		||||
			if (vmu->operator) {
 | 
			
		||||
				strncpy(chan->exten, "o", sizeof(chan->exten) - 1);
 | 
			
		||||
				if (!ast_strlen_zero(vmu->exit)) {
 | 
			
		||||
					strncpy(chan->context, vmu->exit, sizeof(chan->context) - 1);
 | 
			
		||||
				} else if (ousemacro && !ast_strlen_zero(chan->macrocontext)) {
 | 
			
		||||
					strncpy(chan->context, chan->macrocontext, sizeof(chan->context) - 1);
 | 
			
		||||
				}
 | 
			
		||||
				ast_play_and_wait(chan, "transfer");
 | 
			
		||||
				chan->priority = 0;
 | 
			
		||||
				free_user(vmu);
 | 
			
		||||
				return 0;
 | 
			
		||||
			} else {
 | 
			
		||||
				ast_play_and_wait(chan, "vm-sorry");
 | 
			
		||||
				return 0;
 | 
			
		||||
			}
 | 
			
		||||
			chan->priority = 0;
 | 
			
		||||
			free_user(vmu);
 | 
			
		||||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
		if (res >= 0) {
 | 
			
		||||
			/* Unless we're *really* silent, try to send the beep */
 | 
			
		||||
			res = ast_streamfile(chan, "beep", chan->language);
 | 
			
		||||
			if (!res)
 | 
			
		||||
				res = ast_waitstream(chan, "");
 | 
			
		||||
		}
 | 
			
		||||
		if (res < 0) {
 | 
			
		||||
			free_user(vmu);
 | 
			
		||||
@@ -1431,6 +1447,13 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
 | 
			
		||||
		strncpy(fmt, vmfmts, sizeof(fmt) - 1);
 | 
			
		||||
		if (!ast_strlen_zero(fmt)) {
 | 
			
		||||
			msgnum = 0;
 | 
			
		||||
			if (res >= 0) {
 | 
			
		||||
				/* Unless we're *really* silent, try to send the beep */
 | 
			
		||||
				res = ast_streamfile(chan, "beep", chan->language);
 | 
			
		||||
				if (!res)
 | 
			
		||||
					res = ast_waitstream(chan, "");
 | 
			
		||||
			}
 | 
			
		||||
			ast_lock_path(dir);
 | 
			
		||||
			do {
 | 
			
		||||
				make_file(fn, sizeof(fn), dir, msgnum);
 | 
			
		||||
				if (ast_fileexists(fn, NULL, chan->language) <= 0) 
 | 
			
		||||
@@ -1465,22 +1488,19 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
 | 
			
		||||
	chan->name,
 | 
			
		||||
	chan->callerid ? chan->callerid : "Unknown",
 | 
			
		||||
	date, (long)time(NULL));
 | 
			
		||||
					fclose(txt);
 | 
			
		||||
				} else
 | 
			
		||||
					ast_log(LOG_WARNING, "Error opening text file for output\n");
 | 
			
		||||
				res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration);
 | 
			
		||||
				if (res == '0')
 | 
			
		||||
				res = play_record_review(chan, NULL, fn, vmmaxmessage, fmt, 1, vmu, &duration, dir);
 | 
			
		||||
				if (res == '0') {
 | 
			
		||||
					if (txt)
 | 
			
		||||
						fclose(txt);
 | 
			
		||||
					goto transfer;
 | 
			
		||||
				}
 | 
			
		||||
				if (res > 0)
 | 
			
		||||
					res = 0;
 | 
			
		||||
				fd = open(txtfile, O_APPEND | O_WRONLY);
 | 
			
		||||
				if (fd > -1) {
 | 
			
		||||
					txt = fdopen(fd, "a");
 | 
			
		||||
					if (txt) {
 | 
			
		||||
						fprintf(txt, "duration=%d\n", duration);
 | 
			
		||||
						fclose(txt);
 | 
			
		||||
					} else
 | 
			
		||||
						close(fd);
 | 
			
		||||
				if (txt) {
 | 
			
		||||
					fprintf(txt, "duration=%d\n", duration);
 | 
			
		||||
					fclose(txt);
 | 
			
		||||
				}
 | 
			
		||||
				if (duration < vmminmessage) {
 | 
			
		||||
					if (option_verbose > 2) 
 | 
			
		||||
@@ -1505,8 +1525,10 @@ static int leave_voicemail(struct ast_channel *chan, char *ext, int silent, int
 | 
			
		||||
						free_user(recip);
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
				notify_new_message(chan, vmu, msgnum, duration, fmt, chan->callerid);
 | 
			
		||||
				if (ast_fileexists(fn, NULL, NULL))	
 | 
			
		||||
					notify_new_message(chan, vmu, msgnum, duration, fmt, chan->callerid);
 | 
			
		||||
			} else {
 | 
			
		||||
				ast_unlock_path(dir);
 | 
			
		||||
				res = ast_streamfile(chan, "vm-mailboxfull", chan->language);
 | 
			
		||||
				if (!res)
 | 
			
		||||
					res = ast_waitstream(chan, "");
 | 
			
		||||
@@ -1528,16 +1550,58 @@ leave_vm_out:
 | 
			
		||||
 | 
			
		||||
static int count_messages(char *dir)
 | 
			
		||||
{
 | 
			
		||||
	int x;
 | 
			
		||||
	char fn[256];
 | 
			
		||||
	for (x=0;x<MAXMSG;x++) {
 | 
			
		||||
		make_file(fn, sizeof(fn), dir, x);
 | 
			
		||||
		if (ast_fileexists(fn, NULL, NULL) < 1)
 | 
			
		||||
			break;
 | 
			
		||||
	/* Find all .txt files - even if they are not in sequence from 0000 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	int vmcount = 0;
 | 
			
		||||
	DIR *vmdir = NULL;
 | 
			
		||||
	struct dirent *vment = NULL;
 | 
			
		||||
 | 
			
		||||
	if ((vmdir = opendir(dir))) {
 | 
			
		||||
		while ((vment = readdir(vmdir)))
 | 
			
		||||
		{
 | 
			
		||||
			if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
 | 
			
		||||
			{
 | 
			
		||||
				vmcount++;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		closedir(vmdir);
 | 
			
		||||
	}
 | 
			
		||||
	return x;
 | 
			
		||||
 | 
			
		||||
	return vmcount;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void resequence_mailbox(char * dir)
 | 
			
		||||
{
 | 
			
		||||
	/* we know max messages, so stop process when number is hit */
 | 
			
		||||
 | 
			
		||||
	int x,dest;
 | 
			
		||||
	char sfn[256];
 | 
			
		||||
	char dfn[256];
 | 
			
		||||
	char stxt[256];
 | 
			
		||||
	char dtxt[256];
 | 
			
		||||
 | 
			
		||||
	ast_lock_path(dir);
 | 
			
		||||
	for (x=0,dest=0;x<MAXMSG;x++) {
 | 
			
		||||
		make_file(sfn, sizeof(sfn), dir, x);
 | 
			
		||||
		if (ast_fileexists(sfn, NULL, NULL) > 0) {
 | 
			
		||||
 | 
			
		||||
			if(x != dest) {
 | 
			
		||||
				make_file(dfn, sizeof(dfn), dir, dest);
 | 
			
		||||
				ast_filerename(sfn,dfn,NULL);
 | 
			
		||||
 | 
			
		||||
				snprintf(stxt, sizeof(stxt), "%s.txt", sfn);
 | 
			
		||||
				snprintf(dtxt, sizeof(dtxt), "%s.txt", dfn);
 | 
			
		||||
				rename(stxt, dtxt);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			dest++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	ast_unlock_path(dir);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static int say_and_wait(struct ast_channel *chan, int num, char *language)
 | 
			
		||||
{
 | 
			
		||||
	int d;
 | 
			
		||||
@@ -1557,19 +1621,23 @@ static int save_to_folder(char *dir, int msg, char *context, char *username, int
 | 
			
		||||
	make_file(sfn, sizeof(sfn), dir, msg);
 | 
			
		||||
	make_dir(ddir, sizeof(ddir), context, username, dbox);
 | 
			
		||||
	mkdir(ddir, 0700);
 | 
			
		||||
	ast_lock_path(ddir);
 | 
			
		||||
	for (x=0;x<MAXMSG;x++) {
 | 
			
		||||
		make_file(dfn, sizeof(dfn), ddir, x);
 | 
			
		||||
		if (ast_fileexists(dfn, NULL, NULL) < 0)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	if (x >= MAXMSG)
 | 
			
		||||
	if (x >= MAXMSG) {
 | 
			
		||||
		ast_unlock_path(ddir);
 | 
			
		||||
		return -1;
 | 
			
		||||
	}
 | 
			
		||||
	ast_filecopy(sfn, dfn, NULL);
 | 
			
		||||
	if (strcmp(sfn, dfn)) {
 | 
			
		||||
		snprintf(txt, sizeof(txt), "%s.txt", sfn);
 | 
			
		||||
		snprintf(ntxt, sizeof(ntxt), "%s.txt", dfn);
 | 
			
		||||
		copy(txt, ntxt);
 | 
			
		||||
	}
 | 
			
		||||
	ast_unlock_path(ddir);
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2076,23 +2144,10 @@ static int get_folder(struct ast_channel *chan, int start)
 | 
			
		||||
		d = ast_play_and_wait(chan, "vm-for");	/* "for" */
 | 
			
		||||
		if (d)
 | 
			
		||||
			return d;
 | 
			
		||||
		if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French or Portuguese syntax */
 | 
			
		||||
			d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
 | 
			
		||||
			if (d)
 | 
			
		||||
				return d;
 | 
			
		||||
			snprintf(fn, sizeof(fn), "vm-%s", mbox(x));	/* Folder name */
 | 
			
		||||
			d = ast_play_and_wait(chan, fn);
 | 
			
		||||
			if (d)
 | 
			
		||||
				return d;
 | 
			
		||||
		} else {  /* Default English */
 | 
			
		||||
			snprintf(fn, sizeof(fn), "vm-%s", mbox(x));	/* Folder name */
 | 
			
		||||
			d = ast_play_and_wait(chan, fn);
 | 
			
		||||
			if (d)
 | 
			
		||||
				return d;
 | 
			
		||||
			d = ast_play_and_wait(chan, "vm-messages"); /* "messages */
 | 
			
		||||
			if (d)
 | 
			
		||||
				return d;
 | 
			
		||||
		}
 | 
			
		||||
		snprintf(fn, sizeof(fn), "vm-%s", mbox(x));     /* Folder name */
 | 
			
		||||
		d = vm_play_folder_name(chan, fn);
 | 
			
		||||
		if (d)
 | 
			
		||||
			return d;
 | 
			
		||||
		d = ast_waitfordigit(chan, 500);
 | 
			
		||||
		if (d)
 | 
			
		||||
			return d;
 | 
			
		||||
@@ -2215,7 +2270,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
 | 
			
		||||
	char callerid[512];
 | 
			
		||||
	char ext_context[256]="";
 | 
			
		||||
	int res = 0, cmd = 0;
 | 
			
		||||
	struct ast_vm_user *receiver, *extensions = NULL, *vmtmp = NULL, *vmfree;
 | 
			
		||||
	struct ast_vm_user *receiver = NULL, *extensions = NULL, *vmtmp = NULL, *vmfree;
 | 
			
		||||
	char tmp[256];
 | 
			
		||||
	char *stringp, *s;
 | 
			
		||||
	int saved_messages = 0, found = 0;
 | 
			
		||||
@@ -2275,7 +2330,7 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
 | 
			
		||||
				snprintf(todir, sizeof(todir), "%s/voicemail/%s/%s/INBOX",  (char *)ast_config_AST_SPOOL_DIR, vmtmp->context, vmtmp->mailbox);
 | 
			
		||||
				snprintf(sys, sizeof(sys), "mkdir -p %s\n", todir);
 | 
			
		||||
				snprintf(ext_context, sizeof(ext_context), "%s@%s", vmtmp->mailbox, vmtmp->context);
 | 
			
		||||
				ast_log(LOG_DEBUG, sys);
 | 
			
		||||
				ast_log(LOG_DEBUG, "%s", sys);
 | 
			
		||||
				ast_safe_system(sys);
 | 
			
		||||
		
 | 
			
		||||
				todircount = count_messages(todir);
 | 
			
		||||
@@ -2286,11 +2341,11 @@ static int forward_message(struct ast_channel *chan, char *context, char *dir, i
 | 
			
		||||
					if (!strcasecmp(s, "wav49"))
 | 
			
		||||
						s = "WAV";
 | 
			
		||||
					snprintf(sys, sizeof(sys), "cp %s/msg%04d.%s %s/msg%04d.%s\n", dir, curmsg, s, todir, todircount, s);
 | 
			
		||||
					ast_log(LOG_DEBUG, sys);
 | 
			
		||||
					ast_log(LOG_DEBUG, "%s", sys);
 | 
			
		||||
					ast_safe_system(sys);
 | 
			
		||||
				}
 | 
			
		||||
				snprintf(sys, sizeof(sys), "cp %s/msg%04d.txt %s/msg%04d.txt\n", dir, curmsg, todir, todircount);
 | 
			
		||||
				ast_log(LOG_DEBUG, sys);
 | 
			
		||||
				ast_log(LOG_DEBUG, "%s", sys);
 | 
			
		||||
				ast_safe_system(sys);
 | 
			
		||||
				snprintf(fn, sizeof(fn), "%s/msg%04d", todir,todircount);
 | 
			
		||||
	
 | 
			
		||||
@@ -2548,6 +2603,20 @@ static void open_mailbox(struct vm_state *vms, struct ast_vm_user *vmu,int box)
 | 
			
		||||
	strncpy(vms->curbox, mbox(box), sizeof(vms->curbox) - 1);
 | 
			
		||||
	make_dir(vms->curdir, sizeof(vms->curdir), vmu->context, vms->username, vms->curbox);
 | 
			
		||||
	vms->lastmsg = count_messages(vms->curdir) - 1;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	The following test is needed in case sequencing gets messed up.
 | 
			
		||||
	There appears to be more than one way to mess up sequence, so
 | 
			
		||||
	we will not try to find all of the root causes--just fix it when
 | 
			
		||||
	detected.
 | 
			
		||||
	*/
 | 
			
		||||
 | 
			
		||||
	if(vms->lastmsg != last_message_index(vms->curdir))
 | 
			
		||||
	{
 | 
			
		||||
		ast_log(LOG_NOTICE, "Resequencing Mailbox: %s\n", vms->curdir);
 | 
			
		||||
		resequence_mailbox(vms->curdir);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	snprintf(vms->vmbox, sizeof(vms->vmbox), "vm-%s", vms->curbox);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -2558,6 +2627,7 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
 | 
			
		||||
	char txt[256] = "";
 | 
			
		||||
	if (vms->lastmsg > -1) { 
 | 
			
		||||
		/* Get the deleted messages fixed */ 
 | 
			
		||||
		ast_lock_path(vms->curdir);
 | 
			
		||||
		vms->curmsg = -1; 
 | 
			
		||||
		for (x=0;x < MAXMSG;x++) { 
 | 
			
		||||
			if (!vms->deleted[x] && (strcasecmp(vms->curbox, "INBOX") || !vms->heard[x])) { 
 | 
			
		||||
@@ -2584,13 +2654,33 @@ static void close_mailbox(struct vm_state *vms, struct ast_vm_user *vmu)
 | 
			
		||||
				break;
 | 
			
		||||
			vm_delete(vms->fn);
 | 
			
		||||
		} 
 | 
			
		||||
	} 
 | 
			
		||||
	memset(vms->deleted, 0, sizeof(vms->deleted)); 
 | 
			
		||||
	memset(vms->heard, 0, sizeof(vms->heard)); 
 | 
			
		||||
		ast_unlock_path(vms->curdir);
 | 
			
		||||
	}
 | 
			
		||||
	if (vms->deleted)
 | 
			
		||||
		memset(vms->deleted, 0, sizeof(vms->deleted)); 
 | 
			
		||||
	if (vms->heard)
 | 
			
		||||
		memset(vms->heard, 0, sizeof(vms->heard)); 
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vm_play_folder_name(struct ast_channel *chan, char *mbox)
 | 
			
		||||
{
 | 
			
		||||
	int cmd;
 | 
			
		||||
 | 
			
		||||
	if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /*Spanish, French or Portuguese syntax */
 | 
			
		||||
		cmd = ast_play_and_wait(chan, "vm-messages"); /* "messages */
 | 
			
		||||
		if (cmd)
 | 
			
		||||
			return cmd;
 | 
			
		||||
		return ast_play_and_wait(chan, mbox);
 | 
			
		||||
	} else {  /* Default English */
 | 
			
		||||
		cmd = ast_play_and_wait(chan, mbox);
 | 
			
		||||
		if (cmd)
 | 
			
		||||
			return cmd;
 | 
			
		||||
		return ast_play_and_wait(chan, "vm-messages"); /* "messages */
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Default English syntax */
 | 
			
		||||
static int vm_intro(struct ast_channel *chan,struct vm_state *vms)
 | 
			
		||||
static int vm_intro_en(struct ast_channel *chan,struct vm_state *vms)
 | 
			
		||||
{
 | 
			
		||||
	/* Introduce messages they have */
 | 
			
		||||
	int res;
 | 
			
		||||
@@ -2952,6 +3042,26 @@ static int vm_intro_cz(struct ast_channel *chan,struct vm_state *vms)
 | 
			
		||||
	return res;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vm_intro(struct ast_channel *chan,struct vm_state *vms)
 | 
			
		||||
{
 | 
			
		||||
	/* Play voicemail intro - syntax is different for different languages */
 | 
			
		||||
	if (!strcasecmp(chan->language, "de")) {	/* GERMAN syntax */
 | 
			
		||||
		return vm_intro_de(chan, vms);
 | 
			
		||||
	} else if (!strcasecmp(chan->language, "es")) { /* SPANISH syntax */
 | 
			
		||||
		return vm_intro_es(chan, vms);
 | 
			
		||||
	} else if (!strcasecmp(chan->language, "fr")) {	/* FRENCH syntax */
 | 
			
		||||
		return vm_intro_fr(chan, vms);
 | 
			
		||||
	} else if (!strcasecmp(chan->language, "nl")) {	/* DUTCH syntax */
 | 
			
		||||
		return vm_intro_nl(chan, vms);
 | 
			
		||||
	} else if (!strcasecmp(chan->language, "pt")) {	/* PORTUGUESE syntax */
 | 
			
		||||
		return vm_intro_pt(chan, vms);
 | 
			
		||||
	} else if (!strcasecmp(chan->language, "cz")) { /* CZECH syntax */
 | 
			
		||||
		return vm_intro_cz(chan, vms);
 | 
			
		||||
	} else {	/* Default to ENGLISH */
 | 
			
		||||
		return vm_intro_en(chan, vms);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int skipadvanced)
 | 
			
		||||
{
 | 
			
		||||
	int res = 0;
 | 
			
		||||
@@ -2960,17 +3070,8 @@ static int vm_instructions(struct ast_channel *chan, struct vm_state *vms, int s
 | 
			
		||||
		if (vms->starting) {
 | 
			
		||||
			if (vms->lastmsg > -1) {
 | 
			
		||||
				res = ast_play_and_wait(chan, "vm-onefor");
 | 
			
		||||
				if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "fr") || !strcasecmp(chan->language, "pt")) { /* Spanish, French & Portuguese Syntax */
 | 
			
		||||
					if (!res)
 | 
			
		||||
						res = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
					if (!res)
 | 
			
		||||
						res = ast_play_and_wait(chan, vms->vmbox);
 | 
			
		||||
				} else {	/* Default English syntax */
 | 
			
		||||
					if (!res)
 | 
			
		||||
						res = ast_play_and_wait(chan, vms->vmbox);
 | 
			
		||||
					if (!res)
 | 
			
		||||
						res = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
				}
 | 
			
		||||
				if (!res)
 | 
			
		||||
					res = vm_play_folder_name(chan, vms->vmbox);
 | 
			
		||||
			}
 | 
			
		||||
			if (!res)
 | 
			
		||||
				res = ast_play_and_wait(chan, "vm-opts");
 | 
			
		||||
@@ -3034,15 +3135,15 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
 | 
			
		||||
		switch (cmd) {
 | 
			
		||||
		case '1':
 | 
			
		||||
			snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/unavail",vmu->context, vms->username);
 | 
			
		||||
			cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration);
 | 
			
		||||
			cmd = play_record_review(chan,"vm-rec-unv",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
 | 
			
		||||
			break;
 | 
			
		||||
		case '2': 
 | 
			
		||||
			snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/busy",vmu->context, vms->username);
 | 
			
		||||
			cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration);
 | 
			
		||||
			cmd = play_record_review(chan,"vm-rec-busy",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
 | 
			
		||||
			break;
 | 
			
		||||
		case '3': 
 | 
			
		||||
			snprintf(prefile,sizeof(prefile),"voicemail/%s/%s/greet",vmu->context, vms->username);
 | 
			
		||||
			cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration);
 | 
			
		||||
			cmd = play_record_review(chan,"vm-rec-name",prefile, maxgreet, fmtc, 0, vmu, &duration, NULL);
 | 
			
		||||
			break;
 | 
			
		||||
		case '4':
 | 
			
		||||
			if (vmu->password[0] == '-') {
 | 
			
		||||
@@ -3051,19 +3152,24 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
 | 
			
		||||
			}
 | 
			
		||||
			newpassword[1] = '\0';
 | 
			
		||||
			newpassword[0] = cmd = ast_play_and_wait(chan,"vm-newpassword");
 | 
			
		||||
			if (cmd < 0)
 | 
			
		||||
				break;
 | 
			
		||||
			if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0) {
 | 
			
		||||
				break;
 | 
			
		||||
            }
 | 
			
		||||
			if (cmd == '#')
 | 
			
		||||
				newpassword[0] = '\0';
 | 
			
		||||
			else {
 | 
			
		||||
				if (cmd < 0)
 | 
			
		||||
					break;
 | 
			
		||||
				if ((cmd = ast_readstring(chan,newpassword + strlen(newpassword),sizeof(newpassword)-1,2000,10000,"#")) < 0)
 | 
			
		||||
					break;
 | 
			
		||||
			}
 | 
			
		||||
			newpassword2[1] = '\0';
 | 
			
		||||
			newpassword2[0] = cmd = ast_play_and_wait(chan,"vm-reenterpassword");
 | 
			
		||||
			if (cmd < 0)
 | 
			
		||||
				break;
 | 
			
		||||
 | 
			
		||||
			if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#"))) {
 | 
			
		||||
				break;
 | 
			
		||||
            }
 | 
			
		||||
			if (cmd == '#')
 | 
			
		||||
				newpassword2[0] = '\0';
 | 
			
		||||
			else {
 | 
			
		||||
				if (cmd < 0)
 | 
			
		||||
					break;
 | 
			
		||||
				if ((cmd = ast_readstring(chan,newpassword2 + strlen(newpassword2),sizeof(newpassword2)-1,2000,10000,"#")))
 | 
			
		||||
					break;
 | 
			
		||||
                        }
 | 
			
		||||
			if (strcmp(newpassword, newpassword2)) {
 | 
			
		||||
				ast_log(LOG_NOTICE,"Password mismatch for user %s (%s != %s)\n", vms->username, newpassword, newpassword2);
 | 
			
		||||
				cmd = ast_play_and_wait(chan, "vm-mismatch");
 | 
			
		||||
@@ -3095,7 +3201,7 @@ static int vm_options(struct ast_channel *chan, struct ast_vm_user *vmu, struct
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Default English syntax */
 | 
			
		||||
static int vm_browse_messages(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
 | 
			
		||||
static int vm_browse_messages_en(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
 | 
			
		||||
{
 | 
			
		||||
	int cmd=0;
 | 
			
		||||
 | 
			
		||||
@@ -3153,6 +3259,17 @@ static int vm_browse_messages_pt(struct ast_channel *chan, struct vm_state *vms,
 | 
			
		||||
	return cmd;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vm_browse_messages(struct ast_channel *chan, struct vm_state *vms, struct ast_vm_user *vmu)
 | 
			
		||||
{
 | 
			
		||||
	if (!strcasecmp(chan->language, "es")) {        /* SPANISH */
 | 
			
		||||
		return vm_browse_messages_es(chan, vms, vmu);
 | 
			
		||||
	} else if (!strcasecmp(chan->language, "pt")) { /* PORTUGUESE */
 | 
			
		||||
		return vm_browse_messages_pt(chan, vms, vmu);
 | 
			
		||||
	} else {        /* Default to English syntax */
 | 
			
		||||
		return vm_browse_messages_en(chan, vms, vmu);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
{
 | 
			
		||||
	/* XXX This is, admittedly, some pretty horrendus code.  For some
 | 
			
		||||
@@ -3272,7 +3389,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
				goto out;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		if (prefix) {
 | 
			
		||||
		if (prefix && !ast_strlen_zero(prefixstr)) {
 | 
			
		||||
			char fullusername[80] = "";
 | 
			
		||||
			strncpy(fullusername, prefixstr, sizeof(fullusername) - 1);
 | 
			
		||||
			strncat(fullusername, vms.username, sizeof(fullusername) - 1);
 | 
			
		||||
@@ -3293,15 +3410,20 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
		logretries++;
 | 
			
		||||
		if (!valid) {
 | 
			
		||||
			if (skipuser || logretries >= maxlogins) {
 | 
			
		||||
				if (ast_streamfile(chan, "vm-incorrect", chan->language))
 | 
			
		||||
					break;
 | 
			
		||||
				if (ast_streamfile(chan, "vm-incorrect", chan->language)) {
 | 
			
		||||
					ast_log(LOG_WARNING, "Unable to stream incorrect message\n");
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
				if (useadsi)
 | 
			
		||||
					adsi_login(chan);
 | 
			
		||||
				if (ast_streamfile(chan, "vm-incorrect-mailbox", chan->language))
 | 
			
		||||
					break;
 | 
			
		||||
				if (ast_streamfile(chan, "vm-incorrect-mailbox", chan->language)) {
 | 
			
		||||
					ast_log(LOG_WARNING, "Unable to stream incorrect mailbox message\n");
 | 
			
		||||
					return -1;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			ast_waitstream(chan, "");
 | 
			
		||||
			if (ast_waitstream(chan, ""))	/* Channel is hung up */
 | 
			
		||||
				return -1;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if (!valid && (logretries >= maxlogins)) {
 | 
			
		||||
@@ -3336,22 +3458,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
		if (useadsi)
 | 
			
		||||
			adsi_status(chan, &vms);
 | 
			
		||||
		res = 0;
 | 
			
		||||
		/* Play voicemail intro - syntax is different for different languages */
 | 
			
		||||
		if (!strcasecmp(chan->language, "de")) {	/* GERMAN syntax */
 | 
			
		||||
			cmd = vm_intro_de(chan, &vms);
 | 
			
		||||
		} else if (!strcasecmp(chan->language, "es")) { /* SPANISH syntax */
 | 
			
		||||
			cmd = vm_intro_es(chan, &vms);
 | 
			
		||||
		} else if (!strcasecmp(chan->language, "fr")) {	/* FRENCH syntax */
 | 
			
		||||
			cmd = vm_intro_fr(chan, &vms);
 | 
			
		||||
		} else if (!strcasecmp(chan->language, "nl")) {	/* DUTCH syntax */
 | 
			
		||||
			cmd = vm_intro_nl(chan, &vms);
 | 
			
		||||
		} else if (!strcasecmp(chan->language, "pt")) {	/* PORTUGUESE syntax */
 | 
			
		||||
			cmd = vm_intro_pt(chan, &vms);
 | 
			
		||||
		} else if (!strcasecmp(chan->language, "cz")) { /* CZECH syntax */
 | 
			
		||||
			cmd = vm_intro_cz(chan, &vms);
 | 
			
		||||
		} else {	/* Default to ENGLISH */
 | 
			
		||||
			cmd = vm_intro(chan, &vms);
 | 
			
		||||
		}
 | 
			
		||||
		cmd = vm_intro(chan, &vms);
 | 
			
		||||
		vms.repeats = 0;
 | 
			
		||||
		vms.starting = 1;
 | 
			
		||||
		while((cmd > -1) && (cmd != 't') && (cmd != '#')) {
 | 
			
		||||
@@ -3361,13 +3468,7 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
				vms.curmsg = 0;
 | 
			
		||||
				/* Fall through */
 | 
			
		||||
			case '5':
 | 
			
		||||
				if (!strcasecmp(chan->language, "es")) {	/* SPANISH */
 | 
			
		||||
					cmd = vm_browse_messages_es(chan, &vms, vmu);
 | 
			
		||||
				} else if (!strcasecmp(chan->language, "pt")) {	/* PORTUGUESE */
 | 
			
		||||
					cmd = vm_browse_messages_pt(chan, &vms, vmu);
 | 
			
		||||
				} else {	/* Default to English syntax */
 | 
			
		||||
					cmd = vm_browse_messages(chan, &vms, vmu);
 | 
			
		||||
				}
 | 
			
		||||
				cmd = vm_browse_messages(chan, &vms, vmu);
 | 
			
		||||
				break;
 | 
			
		||||
			case '2': /* Change folders */
 | 
			
		||||
				if (useadsi)
 | 
			
		||||
@@ -3383,17 +3484,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
				}
 | 
			
		||||
				if (useadsi)
 | 
			
		||||
					adsi_status2(chan, &vms);
 | 
			
		||||
				if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) {	/* SPANISH or PORTUGUESE */
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, vms.vmbox);
 | 
			
		||||
				} else {	/* Default to English syntax */
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, vms.vmbox);
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
				}
 | 
			
		||||
				if (!cmd)
 | 
			
		||||
					cmd = vm_play_folder_name(chan, vms.vmbox);
 | 
			
		||||
				vms.starting = 1;
 | 
			
		||||
				break;
 | 
			
		||||
			case '3': /* Advanced options */
 | 
			
		||||
@@ -3552,21 +3644,9 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
					cmd = say_and_wait(chan, vms.curmsg + 1, chan->language);
 | 
			
		||||
				if (!cmd)
 | 
			
		||||
					cmd = ast_play_and_wait(chan, "vm-savedto");
 | 
			
		||||
				if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) {	/* SPANISH or PORTUGUESE */
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
					if (!cmd) {
 | 
			
		||||
						snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
 | 
			
		||||
						cmd = ast_play_and_wait(chan, vms.fn);
 | 
			
		||||
					}
 | 
			
		||||
				} else {	/* Default to English */
 | 
			
		||||
					if (!cmd) {
 | 
			
		||||
						snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
 | 
			
		||||
						cmd = ast_play_and_wait(chan, vms.fn);
 | 
			
		||||
					}
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
				}
 | 
			
		||||
				snprintf(vms.fn, sizeof(vms.fn), "vm-%s", mbox(box));
 | 
			
		||||
				if (!cmd)
 | 
			
		||||
					cmd = vm_play_folder_name(chan, vms.fn);
 | 
			
		||||
				if (skipaftercmd) {
 | 
			
		||||
					if (vms.curmsg < vms.lastmsg) {
 | 
			
		||||
                                       		 vms.curmsg++;
 | 
			
		||||
@@ -3580,17 +3660,8 @@ static int vm_execmain(struct ast_channel *chan, void *data)
 | 
			
		||||
			case '*':
 | 
			
		||||
				if (!vms.starting) {
 | 
			
		||||
					cmd = ast_play_and_wait(chan, "vm-onefor");
 | 
			
		||||
					if (!strcasecmp(chan->language, "es") || !strcasecmp(chan->language, "pt")) {	/* Spanish or Portuguese syntax */
 | 
			
		||||
						if (!cmd)
 | 
			
		||||
							cmd = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
						if (!cmd)
 | 
			
		||||
							cmd = ast_play_and_wait(chan, vms.vmbox);
 | 
			
		||||
					} else {
 | 
			
		||||
						if (!cmd)
 | 
			
		||||
							cmd = ast_play_and_wait(chan, vms.vmbox);
 | 
			
		||||
						if (!cmd)
 | 
			
		||||
							cmd = ast_play_and_wait(chan, "vm-messages");
 | 
			
		||||
					}
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = vm_play_folder_name(chan, vms.vmbox);
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
						cmd = ast_play_and_wait(chan, "vm-opts");
 | 
			
		||||
					if (!cmd)
 | 
			
		||||
@@ -3803,7 +3874,7 @@ static int handle_show_voicemail_users(int fd, int argc, char *argv[])
 | 
			
		||||
				if ((vmdir = opendir(dirname))) {
 | 
			
		||||
					/* No matter what the format of VM, there will always be a .txt file for each message. */
 | 
			
		||||
					while ((vment = readdir(vmdir)))
 | 
			
		||||
						if (!strncmp(vment->d_name + 7,".txt",4))
 | 
			
		||||
						if (strlen(vment->d_name) > 7 && !strncmp(vment->d_name + 7,".txt",4))
 | 
			
		||||
							vmcount++;
 | 
			
		||||
					closedir(vmdir);
 | 
			
		||||
				}
 | 
			
		||||
@@ -3927,7 +3998,7 @@ static int load_config(void)
 | 
			
		||||
	zonesl = NULL;
 | 
			
		||||
	users = NULL;
 | 
			
		||||
	usersl = NULL;
 | 
			
		||||
	memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd) - 1);
 | 
			
		||||
	memset(ext_pass_cmd, 0, sizeof(ext_pass_cmd));
 | 
			
		||||
	if (cfg) {
 | 
			
		||||
		/* General settings */
 | 
			
		||||
 | 
			
		||||
@@ -4529,7 +4600,7 @@ static int advanced_options(struct ast_channel *chan, struct ast_vm_user *vmu, s
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
 
 | 
			
		||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration)
 | 
			
		||||
static int play_record_review(struct ast_channel *chan, char *playfile, char *recordfile, int maxtime, char *fmt, int outsidecaller, struct ast_vm_user *vmu, int *duration, const char *unlockdir)
 | 
			
		||||
{
 | 
			
		||||
	/* Record message & let caller review or re-record it, or set options if applicable */
 | 
			
		||||
 	int res = 0;
 | 
			
		||||
@@ -4582,14 +4653,12 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
 | 
			
		||||
 			}
 | 
			
		||||
 			recorded = 1;
 | 
			
		||||
 			/* After an attempt has been made to record message, we have to take care of INTRO and beep for incoming messages, but not for greetings */
 | 
			
		||||
			cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence);
 | 
			
		||||
			cmd = ast_play_and_record(chan, playfile, recordfile, maxtime, fmt, duration, silencethreshold, maxsilence, unlockdir);
 | 
			
		||||
 			if (cmd == -1)
 | 
			
		||||
 			/* User has hung up, no options to give */
 | 
			
		||||
 				return res;
 | 
			
		||||
 				return cmd;
 | 
			
		||||
 			if (cmd == '0') {
 | 
			
		||||
 				/* Erase the message if 0 pushed during playback */
 | 
			
		||||
 				ast_play_and_wait(chan, "vm-deleted");
 | 
			
		||||
 			 	vm_delete(recordfile);
 | 
			
		||||
 				break;
 | 
			
		||||
 			} else if (cmd == '*') {
 | 
			
		||||
 				break;
 | 
			
		||||
 			} 
 | 
			
		||||
@@ -4642,13 +4711,20 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
 | 
			
		||||
 				return 1;
 | 
			
		||||
#endif
 | 
			
		||||
 		case '0':
 | 
			
		||||
 			if (outsidecaller && vmu->operator) {
 | 
			
		||||
 				if (message_exists)
 | 
			
		||||
 					ast_play_and_wait(chan, "vm-msgsaved");
 | 
			
		||||
 				return cmd;
 | 
			
		||||
 			} else
 | 
			
		||||
 				cmd = ast_play_and_wait(chan, "vm-sorry");
 | 
			
		||||
 			break;
 | 
			
		||||
			if (message_exists || recorded) {
 | 
			
		||||
				cmd = ast_play_and_wait(chan, "vm-saveoper");
 | 
			
		||||
				if (!cmd)
 | 
			
		||||
					cmd = ast_waitfordigit(chan, 3000);
 | 
			
		||||
				if (cmd == '1') {
 | 
			
		||||
					ast_play_and_wait(chan, "vm-msgsaved");
 | 
			
		||||
					cmd = '0';
 | 
			
		||||
				} else {
 | 
			
		||||
					ast_play_and_wait(chan, "vm-deleted");
 | 
			
		||||
					vm_delete(recordfile);
 | 
			
		||||
					cmd = '0';
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			return cmd;
 | 
			
		||||
 		default:
 | 
			
		||||
			/* If the caller is an ouside caller, and the review option is enabled,
 | 
			
		||||
			   allow them to review the message, but let the owner of the box review
 | 
			
		||||
@@ -4684,7 +4760,7 @@ static int play_record_review(struct ast_channel *chan, char *playfile, char *re
 | 
			
		||||
 		}
 | 
			
		||||
 	}
 | 
			
		||||
 	if (outsidecaller)  
 | 
			
		||||
 		ast_play_and_wait(chan, "vm-goodbye");
 | 
			
		||||
		ast_play_and_wait(chan, "vm-goodbye");
 | 
			
		||||
 	if (cmd == 't')
 | 
			
		||||
 		cmd = 0;
 | 
			
		||||
 	return cmd;
 | 
			
		||||
@@ -4706,6 +4782,7 @@ static int vm_delete(char *file)
 | 
			
		||||
	return ast_filedelete(file, NULL);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int usecount(void)
 | 
			
		||||
{
 | 
			
		||||
	int res;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_waitforring.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_waitforring.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_zapateller.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_zapateller.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/app_zapbarge.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_zapbarge.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										27
									
								
								apps/app_zapras.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										27
									
								
								apps/app_zapras.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							@@ -125,8 +125,14 @@ static void run_ras(struct ast_channel *chan, char *args)
 | 
			
		||||
	int status;
 | 
			
		||||
	int res;
 | 
			
		||||
	int signalled = 0;
 | 
			
		||||
	struct zt_bufferinfo bi;
 | 
			
		||||
	struct zt_bufferinfo savebi;
 | 
			
		||||
	int x;
 | 
			
		||||
	
 | 
			
		||||
	res = ioctl(chan->fds[0], ZT_GET_BUFINFO, &savebi);
 | 
			
		||||
	if(res) {
 | 
			
		||||
		ast_log(LOG_WARNING, "Unable to check buffer policy on channel %s\n", chan->name);
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pid = spawn_ras(chan, args);
 | 
			
		||||
	if (pid < 0) {
 | 
			
		||||
@@ -162,20 +168,11 @@ static void run_ras(struct ast_channel *chan, char *args)
 | 
			
		||||
			x = 1;
 | 
			
		||||
			ioctl(chan->fds[0], ZT_AUDIOMODE, &x);
 | 
			
		||||
 | 
			
		||||
			/* Double check buffering too */
 | 
			
		||||
			res = ioctl(chan->fds[0], ZT_GET_BUFINFO, &bi);
 | 
			
		||||
			if (!res) {
 | 
			
		||||
				/* XXX This is ZAP_BLOCKSIZE XXX */
 | 
			
		||||
				bi.bufsize = 204;
 | 
			
		||||
				bi.txbufpolicy = ZT_POLICY_IMMEDIATE;
 | 
			
		||||
				bi.rxbufpolicy = ZT_POLICY_IMMEDIATE;
 | 
			
		||||
				bi.numbufs = 4;
 | 
			
		||||
				res = ioctl(chan->fds[0], ZT_SET_BUFINFO, &bi);
 | 
			
		||||
				if (res < 0) {
 | 
			
		||||
					ast_log(LOG_WARNING, "Unable to set buffer policy on channel %s\n", chan->name);
 | 
			
		||||
				}
 | 
			
		||||
			} else
 | 
			
		||||
				ast_log(LOG_WARNING, "Unable to check buffer policy on channel %s\n", chan->name);
 | 
			
		||||
			/* Restore saved values */
 | 
			
		||||
			res = ioctl(chan->fds[0], ZT_SET_BUFINFO, &savebi);
 | 
			
		||||
			if (res < 0) {
 | 
			
		||||
				ast_log(LOG_WARNING, "Unable to set buffer policy on channel %s\n", chan->name);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/app_zapscan.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/app_zapscan.c
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/enter.h
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/enter.h
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
								
								
									
										0
									
								
								apps/leave.h
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/leave.h
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user