components/visual-panels/core/src/cmd/rad/mod/files/mod_files.c
changeset 901 19b502ccabc8
parent 827 0944d8c0158b
child 1410 ca9946e5736c
equal deleted inserted replaced
900:63d3bf696d85 901:19b502ccabc8
    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" };