48 #include <rad/adr.h> |
48 #include <rad/adr.h> |
49 #include <rad/rad_modapi.h> |
49 #include <rad/rad_modapi.h> |
50 |
50 |
51 #include "api_file.h" |
51 #include "api_file.h" |
52 |
52 |
53 static data_t * |
53 static adr_data_t * |
54 empty_file(data_t *data, const char *apath, const char *cpath) |
54 empty_file(adr_data_t *data, const char *apath, const char *cpath) |
55 { |
55 { |
56 struct_set(data, "absolutePath", data_new_string(apath, lt_copy)); |
56 adr_struct_set(data, "absolutePath", |
57 struct_set(data, "canonicalPath", data_new_string(cpath, lt_copy)); |
57 adr_data_new_string(apath, LT_COPY)); |
58 struct_set(data, "canonical", data_new_boolean(B_TRUE)); |
58 adr_struct_set(data, "canonicalPath", |
59 struct_set(data, "baseName", data_new_string("", lt_copy)); |
59 adr_data_new_string(cpath, LT_COPY)); |
60 struct_set(data, "exists", data_new_boolean(B_FALSE)); |
60 adr_struct_set(data, "canonical", adr_data_new_boolean(B_TRUE)); |
61 struct_set(data, "readable", data_new_boolean(B_FALSE)); |
61 adr_struct_set(data, "baseName", adr_data_new_string("", LT_COPY)); |
62 struct_set(data, "writable", data_new_boolean(B_FALSE)); |
62 adr_struct_set(data, "exists", adr_data_new_boolean(B_FALSE)); |
63 struct_set(data, "hidden", data_new_boolean(B_FALSE)); |
63 adr_struct_set(data, "readable", adr_data_new_boolean(B_FALSE)); |
64 struct_set(data, "directory", data_new_boolean(B_FALSE)); |
64 adr_struct_set(data, "writable", adr_data_new_boolean(B_FALSE)); |
65 struct_set(data, "file", data_new_boolean(B_FALSE)); |
65 adr_struct_set(data, "hidden", adr_data_new_boolean(B_FALSE)); |
66 struct_set(data, "lastModified", data_new_time(0, 0)); |
66 adr_struct_set(data, "directory", adr_data_new_boolean(B_FALSE)); |
67 struct_set(data, "length", data_new_long(0)); |
67 adr_struct_set(data, "file", adr_data_new_boolean(B_FALSE)); |
68 struct_set(data, "freeSpace", data_new_long(0)); |
68 adr_struct_set(data, "lastModified", adr_data_new_time(0, 0)); |
69 struct_set(data, "totalSpace", data_new_long(0)); |
69 adr_struct_set(data, "length", adr_data_new_long(0)); |
70 struct_set(data, "usableSpace", data_new_long(0)); |
70 adr_struct_set(data, "freeSpace", adr_data_new_long(0)); |
71 return (data_purify(data)); |
71 adr_struct_set(data, "totalSpace", adr_data_new_long(0)); |
72 } |
72 adr_struct_set(data, "usableSpace", adr_data_new_long(0)); |
73 |
73 return (adr_data_purify(data)); |
74 static data_t * |
74 } |
|
75 |
|
76 static adr_data_t * |
75 read_file(const char *path, const char *file) |
77 read_file(const char *path, const char *file) |
76 { |
78 { |
77 struct stat64 st; |
79 struct stat64 st; |
78 char apath[PATH_MAX] = ""; |
80 char apath[PATH_MAX] = ""; |
79 char cpath[PATH_MAX] = ""; |
81 char cpath[PATH_MAX] = ""; |
80 const char *name = file != NULL ? file : path; |
82 const char *name = file != NULL ? file : path; |
81 |
83 |
82 data_t *data = data_new_struct(&t__FileSnapshot); |
84 adr_data_t *data = adr_data_new_struct(&t__FileSnapshot); |
83 struct_set(data, "path", data_new_string(name, lt_copy)); |
85 adr_struct_set(data, "path", adr_data_new_string(name, LT_COPY)); |
84 struct_set(data, "absolute", data_new_boolean(name[0] == '/')); |
86 adr_struct_set(data, "absolute", adr_data_new_boolean(name[0] == '/')); |
85 |
87 |
86 if (path[0] != '/') { |
88 if (path[0] != '/') { |
87 if (getcwd(apath, PATH_MAX) == NULL) { |
89 if (getcwd(apath, PATH_MAX) == NULL) { |
88 data_free(data); |
90 adr_data_free(data); |
89 return (NULL); |
91 return (NULL); |
90 } |
92 } |
91 if (apath[1] != '\0') |
93 if (apath[1] != '\0') |
92 (void) strlcat(apath, "/", PATH_MAX); |
94 (void) strlcat(apath, "/", PATH_MAX); |
93 (void) strlcat(apath, path, PATH_MAX); |
95 (void) strlcat(apath, path, PATH_MAX); |
97 |
99 |
98 if (resolvepath(apath, cpath, PATH_MAX) == -1 || |
100 if (resolvepath(apath, cpath, PATH_MAX) == -1 || |
99 stat64(path, &st) == -1) |
101 stat64(path, &st) == -1) |
100 return (empty_file(data, apath, apath)); |
102 return (empty_file(data, apath, apath)); |
101 |
103 |
102 struct_set(data, "absolutePath", data_new_string(apath, lt_copy)); |
104 adr_struct_set(data, "absolutePath", |
103 struct_set(data, "canonicalPath", data_new_string(cpath, lt_copy)); |
105 adr_data_new_string(apath, LT_COPY)); |
104 struct_set(data, "canonical", |
106 adr_struct_set(data, "canonicalPath", |
105 data_new_boolean(strcmp(apath, cpath) == 0)); |
107 adr_data_new_string(cpath, LT_COPY)); |
106 struct_set(data, "baseName", data_new_string(basename(apath), lt_copy)); |
108 adr_struct_set(data, "canonical", |
107 struct_set(data, "exists", data_new_boolean(B_TRUE)); |
109 adr_data_new_boolean(strcmp(apath, cpath) == 0)); |
108 struct_set(data, "readable", data_new_boolean(access(path, R_OK) == 0)); |
110 adr_struct_set(data, "baseName", |
109 struct_set(data, "writable", data_new_boolean(access(path, W_OK) == 0)); |
111 adr_data_new_string(basename(apath), LT_COPY)); |
110 struct_set(data, "hidden", data_new_boolean(B_FALSE)); |
112 adr_struct_set(data, "exists", adr_data_new_boolean(B_TRUE)); |
111 struct_set(data, "directory", data_new_boolean(S_ISDIR(st.st_mode))); |
113 adr_struct_set(data, "readable", |
112 struct_set(data, "file", data_new_boolean(S_ISREG(st.st_mode))); |
114 adr_data_new_boolean(access(path, R_OK) == 0)); |
113 struct_set(data, "lastModified", data_new_time_ts(&st.st_mtim)); |
115 adr_struct_set(data, "writable", |
|
116 adr_data_new_boolean(access(path, W_OK) == 0)); |
|
117 adr_struct_set(data, "hidden", adr_data_new_boolean(B_FALSE)); |
|
118 adr_struct_set(data, "directory", |
|
119 adr_data_new_boolean(S_ISDIR(st.st_mode))); |
|
120 adr_struct_set(data, "file", adr_data_new_boolean(S_ISREG(st.st_mode))); |
|
121 adr_struct_set(data, "lastModified", adr_data_new_time_ts(&st.st_mtim)); |
114 /* XXX: 64-bitify */ |
122 /* XXX: 64-bitify */ |
115 struct_set(data, "length", data_new_long(st.st_size)); |
123 adr_struct_set(data, "length", adr_data_new_long(st.st_size)); |
116 struct_set(data, "freeSpace", data_new_long(0)); |
124 adr_struct_set(data, "freeSpace", adr_data_new_long(0)); |
117 struct_set(data, "totalSpace", data_new_long(0)); |
125 adr_struct_set(data, "totalSpace", adr_data_new_long(0)); |
118 struct_set(data, "usableSpace", data_new_long(0)); |
126 adr_struct_set(data, "usableSpace", adr_data_new_long(0)); |
119 return (data_purify(data)); |
127 return (adr_data_purify(data)); |
120 } |
128 } |
121 |
129 |
122 /* ARGSUSED */ |
130 /* ARGSUSED */ |
123 conerr_t |
131 conerr_t |
124 interface_FileBrowser_read_roots(rad_instance_t *inst, adr_attribute_t *attr, |
132 interface_FileBrowser_read_roots(rad_instance_t *inst, adr_attribute_t *attr, |
125 data_t **data, data_t **error) |
133 adr_data_t **data, adr_data_t **error) |
126 { |
134 { |
127 data_t *result = data_new_array(&t_array__FileSnapshot, 1); |
135 adr_data_t *result = adr_data_new_array(&t_array__FileSnapshot, 1); |
128 (void) array_add(result, read_file("/", NULL)); |
136 (void) adr_array_add(result, read_file("/", NULL)); |
129 *data = data_purify(result); |
137 *data = adr_data_purify(result); |
130 return (ce_ok); |
138 return (ce_ok); |
131 } |
139 } |
132 |
140 |
133 /* ARGSUSED */ |
141 /* ARGSUSED */ |
134 conerr_t |
142 conerr_t |
135 interface_FileBrowser_invoke_getFile(rad_instance_t *inst, adr_method_t *meth, |
143 interface_FileBrowser_invoke_getFile(rad_instance_t *inst, adr_method_t *meth, |
136 data_t **ret, data_t **args, int count, data_t **error) |
144 adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error) |
137 { |
145 { |
138 *ret = read_file(data_to_string(args[0]), NULL); |
146 *ret = read_file(adr_data_to_string(args[0]), NULL); |
139 return (ce_ok); |
147 return (ce_ok); |
140 } |
148 } |
141 |
149 |
142 /* ARGSUSED */ |
150 /* ARGSUSED */ |
143 conerr_t |
151 conerr_t |
144 interface_FileBrowser_invoke_getFiles(rad_instance_t *inst, adr_method_t *meth, |
152 interface_FileBrowser_invoke_getFiles(rad_instance_t *inst, adr_method_t *meth, |
145 data_t **ret, data_t **args, int count, data_t **error) |
153 adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error) |
146 { |
154 { |
147 const char *path = data_to_string(args[0]); |
155 const char *path = adr_data_to_string(args[0]); |
148 DIR *d = opendir(path); |
156 DIR *d = opendir(path); |
149 struct dirent *ent; |
157 struct dirent *ent; |
150 data_t *result; |
158 adr_data_t *result; |
151 |
159 |
152 if (d == NULL) |
160 if (d == NULL) |
153 return (ce_object); |
161 return (ce_object); |
154 |
162 |
155 result = data_new_array(&t_array__FileSnapshot, 1); |
163 result = adr_data_new_array(&t_array__FileSnapshot, 1); |
156 while ((ent = readdir(d)) != NULL) { |
164 while ((ent = readdir(d)) != NULL) { |
157 char buf[PATH_MAX]; |
165 char buf[PATH_MAX]; |
158 if (strcmp(ent->d_name, ".") == 0 || |
166 if (strcmp(ent->d_name, ".") == 0 || |
159 strcmp(ent->d_name, "..") == 0) |
167 strcmp(ent->d_name, "..") == 0) |
160 continue; |
168 continue; |
161 int len = strlen(path); |
169 int len = strlen(path); |
162 while (len > 0 && path[len - 1] == '/') |
170 while (len > 0 && path[len - 1] == '/') |
163 len--; |
171 len--; |
164 (void) snprintf(buf, PATH_MAX, "%.*s/%s", len, path, |
172 (void) snprintf(buf, PATH_MAX, "%.*s/%s", len, path, |
165 ent->d_name); |
173 ent->d_name); |
166 data_t *file = read_file(buf, NULL); |
174 adr_data_t *file = read_file(buf, NULL); |
167 if (file != NULL) |
175 if (file != NULL) |
168 (void) array_add(result, file); |
176 (void) adr_array_add(result, file); |
169 } |
177 } |
170 (void) closedir(d); |
178 (void) closedir(d); |
171 *ret = data_purify(result); |
179 *ret = adr_data_purify(result); |
172 |
180 |
173 return (ce_ok); |
181 return (ce_ok); |
174 } |
182 } |
175 |
183 |
176 static rad_modinfo_t modinfo = { "files", "File Browser module" }; |
184 static rad_modinfo_t modinfo = { "files", "File Browser module" }; |