Merged revisions 80044 via svnmerge from
[asterisk/asterisk.git] / funcs / func_env.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2006, Digium, Inc.
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16
17 /*! \file
18  *
19  * \brief Environment related dialplan functions
20  * 
21  * \ingroup functions
22  */
23
24 #include "asterisk.h"
25
26 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
27
28 #include <stdio.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <sys/types.h>
32 #include <sys/stat.h>
33
34 #include "asterisk/module.h"
35 #include "asterisk/channel.h"
36 #include "asterisk/pbx.h"
37 #include "asterisk/logger.h"
38 #include "asterisk/utils.h"
39 #include "asterisk/app.h"
40
41 static int env_read(struct ast_channel *chan, const char *cmd, char *data,
42                     char *buf, size_t len)
43 {
44         char *ret = NULL;
45
46         *buf = '\0';
47
48         if (data)
49                 ret = getenv(data);
50
51         if (ret)
52                 ast_copy_string(buf, ret, len);
53
54         return 0;
55 }
56
57 static int env_write(struct ast_channel *chan, const char *cmd, char *data,
58                      const char *value)
59 {
60         if (!ast_strlen_zero(data)) {
61                 if (!ast_strlen_zero(value)) {
62                         setenv(data, value, 1);
63                 } else {
64                         unsetenv(data);
65                 }
66         }
67
68         return 0;
69 }
70
71 static int stat_read(struct ast_channel *chan, const char *cmd, char *data,
72                      char *buf, size_t len)
73 {
74         char *action;
75         struct stat s;
76
77         *buf = '\0';
78
79         action = strsep(&data, ",");
80         if (stat(data, &s)) {
81                 return -1;
82         } else {
83                 switch (*action) {
84                 case 'e':
85                         strcpy(buf, "1");
86                         break;
87                 case 's':
88                         snprintf(buf, len, "%d", (unsigned int) s.st_size);
89                         break;
90                 case 'f':
91                         snprintf(buf, len, "%d", S_ISREG(s.st_mode) ? 1 : 0);
92                         break;
93                 case 'd':
94                         snprintf(buf, len, "%d", S_ISDIR(s.st_mode) ? 1 : 0);
95                         break;
96                 case 'M':
97                         snprintf(buf, len, "%d", (int) s.st_mtime);
98                         break;
99                 case 'A':
100                         snprintf(buf, len, "%d", (int) s.st_mtime);
101                         break;
102                 case 'C':
103                         snprintf(buf, len, "%d", (int) s.st_ctime);
104                         break;
105                 case 'm':
106                         snprintf(buf, len, "%o", (int) s.st_mode);
107                         break;
108                 }
109         }
110
111         return 0;
112 }
113
114 static struct ast_custom_function env_function = {
115         .name = "ENV",
116         .synopsis = "Gets or sets the environment variable specified",
117         .syntax = "ENV(<envname>)",
118         .read = env_read,
119         .write = env_write,
120 };
121
122 static struct ast_custom_function stat_function = {
123         .name = "STAT",
124         .synopsis = "Does a check on the specified file",
125         .syntax = "STAT(<flag>,<filename>)",
126         .read = stat_read,
127         .desc =
128                 "flag may be one of the following:\n"
129                 "  d - Checks if the file is a directory\n"
130                 "  e - Checks if the file exists\n"
131                 "  f - Checks if the file is a regular file\n"
132                 "  m - Returns the file mode (in octal)\n"
133                 "  s - Returns the size (in bytes) of the file\n"
134                 "  A - Returns the epoch at which the file was last accessed\n"
135                 "  C - Returns the epoch at which the inode was last changed\n"
136                 "  M - Returns the epoch at which the file was last modified\n",
137 };
138
139 static int unload_module(void)
140 {
141         int res = 0;
142
143         res |= ast_custom_function_unregister(&env_function);
144         res |= ast_custom_function_unregister(&stat_function);
145
146         return res;
147 }
148
149 static int load_module(void)
150 {
151         int res = 0;
152
153         res |= ast_custom_function_register(&env_function);
154         res |= ast_custom_function_register(&stat_function);
155
156         return res;
157 }
158
159 AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "Environment/filesystem dialplan functions");