Modify external storage scan
[platform/core/multimedia/media-server.git] / src / common / media-common-utils.c
1 /*
2  *  Media Server
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Yong Yeon Kim <yy9875.kim@samsung.com>
7  *
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  */
21
22 #define _GNU_SOURCE
23 #include <errno.h>
24 #include <vconf.h>
25 #include <aul/aul.h>
26 #include <grp.h>
27 #include <pwd.h>
28 #include <dbus/dbus-glib.h>
29 #include <dbus/dbus.h>
30 #include <dbus/dbus-glib-lowlevel.h>
31
32 #include "media-util.h"
33 #include "media-server-ipc.h"
34 #include "media-common-dbg.h"
35 #include "media-common-system.h"
36 #include "media-common-utils.h"
37
38 #ifdef FMS_PERF
39 #include <sys/time.h>
40 #define MILLION 1000000L
41 struct timeval g_mmc_start_time;
42 struct timeval g_mmc_end_time;
43 #endif
44
45 #define MS_DRM_CONTENT_TYPE_LENGTH 100
46
47 #ifdef FMS_PERF
48 void ms_check_start_time(struct timeval *start_time)
49 {
50         gettimeofday(start_time, NULL);
51 }
52
53 void ms_check_end_time(struct timeval *end_time)
54 {
55         gettimeofday(end_time, NULL);
56 }
57
58 void ms_check_time_diff(struct timeval *start_time, struct timeval *end_time)
59 {
60         struct timeval time;
61         long difftime;
62
63         time.tv_sec = end_time->tv_sec - start_time->tv_sec;
64         time.tv_usec = end_time->tv_usec - start_time->tv_usec;
65         difftime = MILLION * time.tv_sec + time.tv_usec;
66         MS_DBG("The function_to_time took %ld microseconds or %f seconds.",
67                difftime, difftime / (double)MILLION);
68 }
69 #endif
70
71 bool ms_is_mmc_inserted(void)
72 {
73         bool ret = FALSE;
74         ms_stg_type_e stg_type = MS_STG_TYPE_MMC;
75         GArray *dev_list = NULL;
76
77         ret = ms_sys_get_device_list(stg_type, &dev_list);
78         if (ret == MS_MEDIA_ERR_NONE) {
79                 if (dev_list != NULL) {
80                         MS_DBG_ERR("MMC FOUND[%d]", dev_list->len);
81                         ms_sys_release_device_list(&dev_list);
82                         ret = TRUE;
83                 } else {
84                         MS_DBG_ERR("MMC NOT FOUND");
85                 }
86         } else {
87                 MS_DBG_ERR("ms_sys_get_device_list failed");
88         }
89
90         return ret;
91 }
92
93 static char* __media_get_path(uid_t uid)
94 {
95         char *result_psswd = NULL;
96         struct group *grpinfo = NULL;
97         int err = 0;
98
99         if(uid == getuid())
100         {
101                 result_psswd = strdup(MEDIA_ROOT_PATH_INTERNAL);
102                 grpinfo = getgrnam("users");
103                 if(grpinfo == NULL) {
104                         MS_DBG_ERR("getgrnam(users) returns NULL !");
105                         MS_SAFE_FREE(result_psswd);
106                         return NULL;
107                 }
108         }
109         else
110         {
111                 struct passwd *userinfo = getpwuid(uid);
112                 if(userinfo == NULL) {
113                         MS_DBG_ERR("getpwuid(%d) returns NULL !", uid);
114                         return NULL;
115                 }
116                 grpinfo = getgrnam("users");
117                 if(grpinfo == NULL) {
118                         MS_DBG_ERR("getgrnam(users) returns NULL !");
119                         return NULL;
120                 }
121                 // Compare git_t type and not group name
122                 if (grpinfo->gr_gid != userinfo->pw_gid) {
123                         MS_DBG_ERR("UID [%d] does not belong to 'users' group!", uid);
124                         return NULL;
125                 }
126                 err = asprintf(&result_psswd, "%s", userinfo->pw_dir);
127                 if(err < 0) {
128                         MS_DBG_ERR("asprintf failed [%d]", err);
129                         return NULL;
130                 }
131         }
132
133         return result_psswd;
134 }
135
136 ms_storage_type_t ms_get_storage_type_by_full(const char *path, uid_t uid)
137 {
138         int length_path;
139         char * user_path = NULL;
140
141         if (path == NULL)
142                 return false;
143
144         user_path = __media_get_path(uid);
145         length_path = strlen(user_path);
146
147         if (strncmp(path, user_path, length_path) == 0) {
148                 return MS_STORAGE_INTERNAL;
149         } else if (strncmp(path, MEDIA_ROOT_PATH_SDCARD, strlen(MEDIA_ROOT_PATH_SDCARD)) == 0) {
150                 return MS_STORAGE_EXTERNAL;
151         } else {
152                 free(user_path);
153                 return MS_MEDIA_ERR_INVALID_PATH;
154     }
155 }
156
157 int ms_strappend(char *res, const int size, const char *pattern,
158              const char *str1, const char *str2)
159 {
160         int len = 0;
161         int real_size = size - 1;
162
163         if (!res ||!pattern || !str1 ||!str2 )
164                 return MS_MEDIA_ERR_INVALID_PARAMETER;
165
166         if (real_size < (int)(strlen(str1) + strlen(str2)))
167                 return MS_MEDIA_ERR_INVALID_PARAMETER;
168
169         len = snprintf(res, real_size, pattern, str1, str2);
170         if (len < 0) {
171                 return MS_MEDIA_ERR_INVALID_PARAMETER;
172         }
173
174         res[len] = '\0';
175
176         return MS_MEDIA_ERR_NONE;
177 }
178
179 int ms_strcopy(char *res, const int size, const char *pattern, const char *str1)
180 {
181         int len = 0;
182         int real_size = size;
183
184         if (!res || !pattern || !str1) {
185                 MS_DBG_ERR("parameta is invalid");
186                 return MS_MEDIA_ERR_INVALID_PARAMETER;
187         }
188
189         if (real_size < (int)(strlen(str1))) {
190                 MS_DBG_ERR("size is wrong");
191                 return MS_MEDIA_ERR_INVALID_PARAMETER;
192         }
193
194         len = snprintf(res, real_size, pattern, str1);
195         if (len < 0) {
196                 MS_DBG_ERR("snprintf failed");
197                 return MS_MEDIA_ERR_INVALID_PARAMETER;
198         }
199
200         res[len] = '\0';
201
202         return MS_MEDIA_ERR_NONE;
203 }
204
205 bool ms_config_get_int(const char *key, int *value)
206 {
207         int err;
208
209         if (!key || !value) {
210                 MS_DBG_ERR("Arguments key or value is NULL");
211                 return false;
212         }
213
214         err = vconf_get_int(key, value);
215         if (err == 0)
216                 return true;
217         else if (err == -1)
218                 return false;
219         else
220                 MS_DBG_ERR("Unexpected error code: %d", err);
221
222         return false;
223 }
224
225 bool ms_config_set_int(const char *key, int value)
226 {
227         int err;
228
229         if (!key) {
230                 MS_DBG_ERR("Arguments key is NULL");
231                 return false;
232         }
233
234         err = vconf_set_int(key, value);
235         if (err == 0)
236                 return true;
237         else if (err == -1)
238                 return false;
239         else
240                 MS_DBG_ERR("Unexpected error code: %d", err);
241
242         return false;
243 }
244
245 bool ms_config_get_str(const char *key, char **value)
246 {
247         char *res = NULL;
248
249         if (key == NULL || value == NULL) {
250                 MS_DBG_ERR("Arguments key or value is NULL");
251                 return false;
252         }
253
254         res = vconf_get_str(key);
255         if (MS_STRING_VALID(res)) {
256                 *value = strdup(res);
257                 MS_SAFE_FREE(res);
258                 return true;
259         }
260
261         return false;
262 }
263
264 bool ms_config_set_str(const char *key, const char *value)
265 {
266         int err;
267
268         if (!key || !value) {
269                 MS_DBG_ERR("Arguments key or value is NULL");
270                 return false;
271         }
272
273         err = vconf_set_str(key, value);
274         if (err == 0)
275                 return true;
276         else
277                 MS_DBG_ERR("fail to vconf_set_str %d", err);
278
279         return false;
280 }
281
282 bool ms_config_get_bool(const char *key, int *value)
283 {
284         int err;
285
286         if (!key || !value) {
287                 MS_DBG_ERR("Arguments key or value is NULL");
288                 return false;
289         }
290
291         err = vconf_get_bool(key, value);
292         if (err == 0)
293                 return true;
294         else if (err == -1)
295                 return false;
296         else
297                 MS_DBG_ERR("Unexpected error code: %d", err);
298
299         return false;
300 }