Esempio n. 1
0
int ifuse_link(const char *target, const char *linkname)
{
	afc_client_t afc = fuse_get_context()->private_data;

	afc_error_t err = afc_make_link(afc, AFC_HARDLINK, target, linkname);
	if (err == AFC_E_SUCCESS)
		return 0;

	return -get_afc_error_as_errno(err);
}
Esempio n. 2
0
static afc_error_t cmd_ln(int argc, const char *argv[])
{
	afc_error_t result;
	int type = AFC_HARDLINK;
	char *source_path = NULL;
	char *target_path = NULL;

	if (argc == 3 && str_is_equal("-s", argv[0])) {
		type = AFC_SYMLINK;
		argc--;
		argv++;
	}
	if (argc != 2) {
		warnx("usage: ln [-s] <source> <target>");
		return AFC_E_INVALID_ARG;
	}

	if (type == AFC_HARDLINK)
		source_path = build_absolute_path(argv[0]);
	else
		source_path = strdup(argv[0]);

	target_path = build_absolute_path(argv[1]);

	if (!source_path || !target_path) {
		free(source_path);
		free(target_path);
		return AFC_E_INTERNAL_ERROR;
	}

//	warnx("%s: %s -> %s\n", type == AFC_HARDLINK ? "hard link" : "sym link", source_path, target_path);

	result = afc_make_link(afc, type, source_path, target_path);
	if (result == AFC_E_OBJECT_NOT_FOUND)
		afc_warn(result, "%s", argv[0]);
	else if (result != AFC_E_SUCCESS)
		afc_warn(result, "afc_make_link");

	free(source_path);
	free(target_path);

	return result;
}
static void afc_upload_dir(afc_client_t afc, const char* path, const char* afcpath)
{
	afc_make_directory(afc, afcpath);

	DIR *dir = opendir(path);
	if (dir) {
		struct dirent* ep;
		while ((ep = readdir(dir))) {
			if ((strcmp(ep->d_name, ".") == 0) || (strcmp(ep->d_name, "..") == 0)) {
				continue;
			}
			char *fpath = (char*)malloc(strlen(path)+1+strlen(ep->d_name)+1);
			char *apath = (char*)malloc(strlen(afcpath)+1+strlen(ep->d_name)+1);

			struct stat st;

			strcpy(fpath, path);
			strcat(fpath, "/");
			strcat(fpath, ep->d_name);

			strcpy(apath, afcpath);
			strcat(apath, "/");
			strcat(apath, ep->d_name);

#ifdef HAVE_LSTAT
			if ((lstat(fpath, &st) == 0) && S_ISLNK(st.st_mode)) {
				char *target = (char *)malloc(st.st_size);
				readlink(fpath, target, st.st_size);
				afc_make_link(afc, AFC_SYMLINK, target, fpath);
				free(target);
			} else
#endif
			if ((stat(fpath, &st) == 0) && S_ISDIR(st.st_mode)) {
				afc_upload_dir(afc, fpath, apath);
			} else {
				afc_upload_file(afc, fpath, apath);
			}
			free(fpath);
			free(apath);
		}
		closedir(dir);
	}
}