make app_queue 1.2 jump compliant (issue #5580)
[asterisk/asterisk.git] / apps / app_striplsd.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*! \file
20  *
21  * \brief striplsd: Strip trailing digits app
22  * 
23  * \ingroup applications
24  */
25
26 #include <stdlib.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include <unistd.h>
30 #include <sys/types.h>
31
32 #include "asterisk.h"
33
34 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
35
36 #include "asterisk/file.h"
37 #include "asterisk/logger.h"
38 #include "asterisk/channel.h"
39 #include "asterisk/pbx.h"
40 #include "asterisk/module.h"
41 #include "asterisk/lock.h"
42
43 static char *tdesc = "Strip trailing digits";
44
45 static char *descrip =
46 "  StripLSD(count): Strips the trailing  'count'  digits  from  the  channel's\n"
47 "associated extension. For example, the  number  5551212 when stripped with a\n"
48 "count of 4 would be changed to 555.  The PBX will continue processing at the\n""next priority for the *new* extension.\n"
49 "  So, for  example, if  priority 3 of 5551212  is  StripLSD 4, the next step\n"
50 "executed will be priority 4 of 555.  If you switch into an  extension which\n"
51 "has no first step, the PBX will treat it as though the user dialed an\n"
52 "invalid extension.\n";
53
54 static char *app = "StripLSD";
55
56 static char *synopsis = "Strip Least Significant Digits";
57
58 STANDARD_LOCAL_USER;
59
60 LOCAL_USER_DECL;
61
62 static int striplsd_exec(struct ast_channel *chan, void *data)
63 {
64         char newexten[AST_MAX_EXTENSION] = "";
65         int maxbytes = 0;
66         int stripcount = 0;
67         int extlen = strlen(chan->exten);
68         struct localuser *u;
69
70         LOCAL_USER_ADD(u);
71
72         maxbytes = sizeof(newexten) - 1;
73         if (data) {
74                 stripcount = atoi(data);
75         }
76         if (!stripcount) {
77                 ast_log(LOG_DEBUG, "Ignoring, since number of digits to strip is 0\n");
78                 LOCAL_USER_REMOVE(u);
79                 return 0;
80         }
81         if (extlen > stripcount) {
82                 if (extlen - stripcount <= maxbytes) {
83                         maxbytes = extlen - stripcount;
84                 }
85                 strncpy(newexten, chan->exten, maxbytes);
86         }
87         strncpy(chan->exten, newexten, sizeof(chan->exten)-1);
88
89         LOCAL_USER_REMOVE(u);
90
91         return 0;
92 }
93
94 int unload_module(void)
95 {
96         int res;
97
98         res = ast_unregister_application(app);
99
100         STANDARD_HANGUP_LOCALUSERS;
101
102         return res;     
103 }
104
105 int load_module(void)
106 {
107         return ast_register_application(app, striplsd_exec, synopsis, descrip);
108 }
109
110 char *description(void)
111 {
112         return tdesc;
113 }
114
115 int usecount(void)
116 {
117         int res;
118         STANDARD_USECOUNT(res);
119         return res;
120 }
121
122 char *key()
123 {
124         return ASTERISK_GPL_KEY;
125 }