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); }
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); } }