1 /**
2 * @file fs.c File-system functions
3 *
4 * Copyright (C) 2010 Creytiv.com
5 */
6 #include <stdlib.h>
7 #include <string.h>
8 #include <sys/stat.h>
9 #include <sys/types.h>
10 #include <fcntl.h>
11 #ifdef HAVE_UNISTD_H
12 #include <unistd.h>
13 #endif
destructor(void * arg)14 #ifdef HAVE_PWD_H
15 #include <pwd.h>
16 #endif
17 #ifdef WIN32
18 #include <windows.h>
19 #include <shlobj.h>
20 #include <direct.h>
21 #include <lmaccess.h>
22 #endif
23 #include <re_types.h>
24 #include <re_fmt.h>
25 #include <re_sys.h>
26
27
28 /**
29 * Create a directory with full path
30 *
31 * @param path Directory path
32 * @param mode Access permissions
33 *
34 * @return 0 if success, otherwise errorcode
35 */
36 int fs_mkdir(const char *path, uint16_t mode)
37 {
38 int ret;
39
40 if (!path)
41 return EINVAL;
42
43 #if defined (WIN32)
44 (void)mode;
45 ret = _mkdir(path);
46 #else
47 ret = mkdir(path, mode);
48 #endif
49 if (ret < 0)
50 return errno;
51
52 return 0;
53 }
54
55
56 /**
57 * Get the home directory for the current user
58 *
59 * @param path String to write home directory
60 * @param sz Size of path string
61 *
62 * @return 0 if success, otherwise errorcode
63 */
64 int fs_gethome(char *path, size_t sz)
65 {
66 #ifdef WIN32
67 char win32_path[MAX_PATH];
68
69 if (!path || !sz)
70 return EINVAL;
71
odict_count(const struct odict * o,bool nested)72 if (S_OK != SHGetFolderPath(NULL,
73 CSIDL_APPDATA | CSIDL_FLAG_CREATE,
74 NULL,
75 0,
76 win32_path)) {
77 return ENOENT;
78 }
79
80 str_ncpy(path, win32_path, sz);
81
82 return 0;
83
84 #elif defined(HAVE_PWD_H)
85 const char *loginname;
86 struct passwd *pw;
87
88 if (!path || !sz)
89 return EINVAL;
90
91 loginname = sys_username();
92 if (!loginname)
93 return ENOENT;
94
95 pw = getpwnam(loginname);
96 if (!pw)
97 return errno;
98
99 str_ncpy(path, pw->pw_dir, sz);
100
101 return 0;
102 #else
103 (void)path;
odict_debug(struct re_printf * pf,const struct odict * o)104 (void)sz;
105 return ENOSYS;
106 #endif
107 }
108