Beispiel #1
0
static int
handle_new(int use, const char *name, int fd, int flags, DIR *dirp)
{
	int i;

	if (first_unused_handle == -1) {
		if (num_handles + 1 <= num_handles)
			return -1;
		num_handles++;
		handles = xreallocarray(handles, num_handles, sizeof(Handle));
		handle_unused(num_handles - 1);
	}

	i = first_unused_handle;
	first_unused_handle = handles[i].next_unused;

	handles[i].use = use;
	handles[i].dirp = dirp;
	handles[i].fd = fd;
	handles[i].flags = flags;
	handles[i].name = xstrdup(name);
	handles[i].bytes_read = handles[i].bytes_write = 0;

	return i;
}
Beispiel #2
0
bool SFTP::handle_close(int handle)
{
	bool ret = false;

	if (handle_is_ok(handle, HANDLE_FILE)) {
    ret = ::CloseHandle (handles[handle].fileHandle)
      == TRUE;
		handle_unused(handle);
	} else if (handle_is_ok(handle, HANDLE_DIR)) {
    ret = ::CloseHandle (handles[handle].dirp)
      == TRUE;
		handle_unused(handle);
	} else {
    ::SetLastError (ERROR_FILE_NOT_FOUND);
	}
	return ret;
}
Beispiel #3
0
static int
handle_close(int handle)
{
	int ret = -1;

	if (handle_is_ok(handle, HANDLE_FILE)) {
		ret = close(handles[handle].fd);
		free(handles[handle].name);
		handle_unused(handle);
	} else if (handle_is_ok(handle, HANDLE_DIR)) {
		ret = closedir(handles[handle].dirp);
		free(handles[handle].name);
		handle_unused(handle);
	} else {
		errno = ENOENT;
	}
	return ret;
}