INT64_T chirp_multi_readlink(const char *volume, const char *path, char *buf, INT64_T length, time_t stoptime) { char lpath[CHIRP_PATH_MAX]; if(chirp_multi_lpath(volume, path, lpath, stoptime)) { return chirp_reli_readlink(current_volume->host, lpath, buf, length, stoptime); } else { return -1; } }
static INT64_T do_get_one_link(const char *hostport, const char *source_file, const char *target_file, time_t stoptime) { char linkdata[CHIRP_PATH_MAX]; INT64_T result; result = chirp_reli_readlink(hostport, source_file, linkdata, sizeof(linkdata), stoptime); if(result >= 0) { linkdata[result] = 0; unlink(target_file); result = symlink(linkdata, target_file); if(result >= 0) result = 0; } return result; }
INT64_T chirp_global_readlink(const char *host, const char *path, char *buf, INT64_T length, time_t stoptime) { if(is_multi_path(host)) { char mhost[CHIRP_PATH_MAX]; char mpath[CHIRP_PATH_MAX]; parse_multi_path(path, mhost, mpath); return chirp_multi_readlink(mhost, mpath, buf, length, stoptime); } else if(not_empty(path)) { return chirp_reli_readlink(host, path, buf, length, stoptime); } else if(not_empty(host)) { if(server_lookup(host, stoptime)) { errno = EINVAL; return -1; } else { errno = ENOENT; return -1; } } else { errno = EINVAL; return -1; } }