Beispiel #1
0
INT64_T cfs_basic_putfile(const char *path, struct link * link, INT64_T length, INT64_T mode, time_t stoptime)
{
	int fd;
	INT64_T result;

	mode = 0600 | (mode & 0100);

	fd = cfs->open(path, O_WRONLY | O_CREAT | O_TRUNC, (int) mode);
	if(fd >= 0) {
		char buffer[65536];
		INT64_T total = 0;

		link_putliteral(link, "0\n", stoptime);

		while(length > 0) {
			INT64_T ractual, wactual;
			INT64_T chunk = MIN((int) sizeof(buffer), length);

			ractual = link_read(link, buffer, chunk, stoptime);
			if(ractual <= 0)
				break;

			wactual = cfs->pwrite(fd, buffer, ractual, total);
			if(wactual != ractual) {
				total = -1;
				break;
			}

			total += ractual;
			length -= ractual;
		}

		result = total;

		if(length != 0) {
			if(result >= 0)
				link_soak(link, length - result, stoptime);
			result = -1;
		}
		cfs->close(fd);
	} else {
		result = -1;
	}
	return result;
}
Beispiel #2
0
INT64_T chirp_client_flistxattr(struct chirp_client *c, INT64_T fd, char *list, size_t size, time_t stoptime)
{
	INT64_T result = send_command(c, stoptime, "flistxattr %lld\n", fd);
    if (result < 0) 
        return result;
	result = get_result(c, stoptime);
    if (result < 0) 
        return result;
    if (result > (int) size) {
		link_soak(c->link, result, stoptime);
        errno = ERANGE;
        return result;
    }
	if(!link_read(c->link, list, result, stoptime)) {
        return -1;
    }
    return result;
}
Beispiel #3
0
INT64_T chirp_client_llistxattr(struct chirp_client *c, const char *path, char *list, size_t size, time_t stoptime)
{
	char safepath[CHIRP_LINE_MAX];
	url_encode(path, safepath, sizeof(safepath));
	INT64_T result = send_command(c, stoptime, "llistxattr %s\n", safepath);
    if (result < 0) 
        return result;
	result = get_result(c, stoptime);
    if (result < 0) 
        return result;
    if (result > (int) size) {
		link_soak(c->link, result, stoptime);
        errno = ERANGE;
        return result;
    }
	if(!link_read(c->link, list, result, stoptime)) {
        return -1;
    }
    return result;
}
Beispiel #4
0
INT64_T chirp_client_fgetxattr(struct chirp_client *c, INT64_T fd, const char *name, void *data, size_t size, time_t stoptime)
{
	INT64_T result = send_command(c, stoptime, "fgetxattr %lld %s\n", fd, name);
    if (result < 0)
        return result;

	result = get_result(c, stoptime);
    if (result < 0) { 
		if (errno == EINVAL) errno = ENOATTR;
        return result;
	} else if (result > (int) size) {
		link_soak(c->link, result, stoptime);
        errno = ERANGE;
        return result;
    }
	if(!link_read(c->link, data, result, stoptime)) {
        return -1;
    }
    return result;
}
Beispiel #5
0
INT64_T chirp_client_lgetxattr(struct chirp_client *c, const char *path, const char *name, void *data, size_t size, time_t stoptime)
{
	char safepath[CHIRP_LINE_MAX];
	url_encode(path, safepath, sizeof(safepath));
	INT64_T result = send_command(c, stoptime, "lgetxattr %s %s\n", safepath, name);
    if (result < 0)
        return result;
	result = get_result(c, stoptime);
    if (result < 0) {
		if (errno == EINVAL) errno = ENOATTR;
        return result;
	} else if (result > (int) size) {
		link_soak(c->link, result, stoptime);
        errno = ERANGE;
        return result;
    }
	if(!link_read(c->link, data, result, stoptime)) {
        return -1;
    }
    return result;
}