mirror of
https://github.com/asterisk/asterisk.git
synced 2025-08-17 19:46:52 +00:00
Compare commits
466 Commits
18.14.0-rc
...
1.0.11.1
Author | SHA1 | Date | |
---|---|---|---|
|
68cdab7e54 | ||
|
3b3f456199 | ||
|
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
|
2
CREDITS
Executable file → Normal file
2
CREDITS
Executable file → Normal file
@@ -58,6 +58,8 @@ 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
|
||||
|
276
CHANGES → ChangeLog
Executable file → Normal file
276
CHANGES → ChangeLog
Executable file → Normal file
@@ -1,4 +1,279 @@
|
||||
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-CVS mailing list hosted at http://lists.digium.com.
|
||||
|
||||
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.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 +281,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
|
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.
|
||||
|
0
README.fpm
Executable file → Normal file
0
README.fpm
Executable file → Normal file
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
0
apps/rpt_flow.pdf
Executable file → Normal file
0
apps/rpt_flow.pdf
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