Fix compile time warnings
[asterisk/asterisk.git] / funcs / func_env.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, 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  */
22
23 #include <stdio.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
28
29 #include "asterisk.h"
30
31 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
32
33 #include "asterisk/module.h"
34 #include "asterisk/channel.h"
35 #include "asterisk/pbx.h"
36 #include "asterisk/logger.h"
37 #include "asterisk/utils.h"
38 #include "asterisk/app.h"
39
40 static char *env_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len) 
41 {
42         char *ret = "";
43
44         if (data) {
45                 ret = getenv(data);
46                 if (!ret)
47                         ret = "";
48         }
49         ast_copy_string(buf, ret, len);
50
51         return buf;
52 }
53
54 static void env_write(struct ast_channel *chan, char *cmd, char *data, const char *value) 
55 {
56         if (!ast_strlen_zero(data)) {
57                 if (!ast_strlen_zero(value)) {
58                         setenv(data, value, 1);
59                 } else {
60                         unsetenv(data);
61                 }
62         }
63 }
64
65 static char *stat_read(struct ast_channel *chan, char *cmd, char *data, char *buf, size_t len)
66 {
67         char *action;
68         struct stat s;
69
70         ast_copy_string(buf, "0", len);
71         if (!data) {
72                 ast_log(LOG_ERROR, "Out of memory\n");
73                 return buf;
74         }
75
76         action = strsep(&data, "|");
77         if (stat(data, &s)) {
78                 return buf;
79         } else {
80                 switch (*action) {
81                 case 'e':
82                         ast_copy_string(buf, "1", len);
83                         break;
84                 case 's':
85                         snprintf(buf, len, "%d", (unsigned int)s.st_size);
86                         break;
87                 case 'f':
88                         snprintf(buf, len, "%d", S_ISREG(s.st_mode) ? 1 : 0);
89                         break;
90                 case 'd':
91                         snprintf(buf, len, "%d", S_ISDIR(s.st_mode) ? 1 : 0);
92                         break;
93                 case 'M':
94                         snprintf(buf, len, "%d", (int)s.st_mtime);
95                         break;
96                 case 'A':
97                         snprintf(buf, len, "%d", (int)s.st_mtime);
98                         break;
99                 case 'C':
100                         snprintf(buf, len, "%d", (int)s.st_ctime);
101                         break;
102                 case 'm':
103                         snprintf(buf, len, "%o", (int)s.st_mode);
104                         break;
105                 }
106         }
107         return buf;
108 }
109
110 static struct ast_custom_function env_function = {
111         .name = "ENV",
112         .synopsis = "Gets or sets the environment variable specified",
113         .syntax = "ENV(<envname>)",
114         .read = env_read,
115         .write = env_write,
116 };
117
118 static struct ast_custom_function stat_function = {
119         .name = "STAT",
120         .synopsis = "Does a check on the specified file",
121         .syntax = "STAT(<flag>,<filename>)",
122         .read = stat_read,
123         .desc =
124 "flag may be one of the following:\n"
125 "  d - Checks if the file is a directory\n"
126 "  e - Checks if the file exists\n"
127 "  f - Checks if the file is a regular file\n"
128 "  m - Returns the file mode (in octal)\n"
129 "  s - Returns the size (in bytes) of the file\n"
130 "  A - Returns the epoch at which the file was last accessed\n"
131 "  C - Returns the epoch at which the inode was last changed\n"
132 "  M - Returns the epoch at which the file was last modified\n",
133 };
134
135
136 static char *tdesc = "Environment/filesystem dialplan functions";
137
138 int unload_module(void)
139 {
140         int res = 0;
141
142         res |= ast_custom_function_unregister(&env_function);
143         res |= ast_custom_function_unregister(&stat_function);
144
145         return res;
146 }
147
148 int load_module(void)
149 {
150         int res = 0;
151
152         res |= ast_custom_function_register(&env_function);
153         res |= ast_custom_function_register(&stat_function);
154
155         return res;
156 }
157
158 char *description(void)
159 {
160         return tdesc;
161 }
162
163 int usecount(void)
164 {
165         return 0;
166 }
167
168 char *key()
169 {
170         return ASTERISK_GPL_KEY;
171 }
172
173 /*
174 Local Variables:
175 mode: C
176 c-file-style: "linux"
177 indent-tabs-mode: nil
178 End:
179 */