Пример #1
0
Result APT_ReceiveDeliverArg_(void* param, size_t param_size, void* hmac, size_t hmac_size, u64* source_pid, bool* received)
{
	u32 cmdbuf[16];
	cmdbuf[0]=IPC_MakeHeader(0x35,2,0);
	cmdbuf[1]=param_size;
	cmdbuf[2]=hmac_size;

	u32 saved_threadstorage[4];
	u32* staticbufs = getThreadStaticBuffers();
   saved_threadstorage[0]=staticbufs[0];
	saved_threadstorage[1]=staticbufs[1];
   saved_threadstorage[2]=staticbufs[2];
	saved_threadstorage[3]=staticbufs[3];
   staticbufs[0]=IPC_Desc_StaticBuffer(param_size, 0);
	staticbufs[1]=(u32)param;
   staticbufs[2]=IPC_Desc_StaticBuffer(hmac_size, 2);
	staticbufs[3]=(u32)hmac;

	Result ret = aptSendCommand(cmdbuf);
   staticbufs[0]=saved_threadstorage[0];
	staticbufs[1]=saved_threadstorage[1];
   staticbufs[2]=saved_threadstorage[2];
	staticbufs[3]=saved_threadstorage[3];

   if(R_FAILED(ret))
      return ret;

   if(source_pid)
      *source_pid = ((u64*)cmdbuf)[1];
   if(received)
      *received = ((bool*)cmdbuf)[16];

	return cmdbuf[1];
}
Пример #2
0
Result udsGetApplicationData(void *buf, size_t size, size_t *actual_size)
{
	u32* cmdbuf=getThreadCommandBuffer();
	u32 saved_threadstorage[2];

	cmdbuf[0]=IPC_MakeHeader(0x11,1,0); // 0x110040
	cmdbuf[1]=size;

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(size,0);
	staticbufs[1] = (u32)buf;

	Result ret=0;
	ret=svcSendSyncRequest(__uds_servhandle);

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	if(R_FAILED(ret))return ret;

	ret = cmdbuf[1];

	if(R_SUCCEEDED(ret))
	{
		if(actual_size)*actual_size = cmdbuf[2];
	}

	return ret;
}
Пример #3
0
Result APT_AppletUtility(u32* out, u32 a, u32 size1, u8* buf1, u32 size2, u8* buf2)
{
	u32 saved_threadstorage[2];
	
	u32* cmdbuf=getThreadCommandBuffer();
	cmdbuf[0]=IPC_MakeHeader(0x4B,3,2); // 0x4B00C2
	cmdbuf[1]=a;
	cmdbuf[2]=size1;
	cmdbuf[3]=size2;
	cmdbuf[4]=IPC_Desc_StaticBuffer(size1,1);
	cmdbuf[5]=(u32)buf1;

	u32 *staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0]=staticbufs[0];
	saved_threadstorage[1]=staticbufs[1];
	
	staticbufs[0]=IPC_Desc_StaticBuffer(size2,0);
	staticbufs[1]=(u32)buf2;
	
	Result ret=svcSendSyncRequest(aptuHandle);
	
	staticbufs[0]=saved_threadstorage[0];
	staticbufs[1]=saved_threadstorage[1];
	
	if(R_FAILED(ret))return ret;
	
	if(out)*out=cmdbuf[2];

	return cmdbuf[1];
}
Пример #4
0
static Result udsipc_DecryptBeaconData(udsNetworkStruct *network, u8 *tag0, u8 *tag1, udsNodeInfo *out)
{
	u32* cmdbuf=getThreadCommandBuffer();
	u32 tagsize = 0xfe;

	u32 saved_threadstorage[2];

	cmdbuf[0]=IPC_MakeHeader(0x1F,0,6); // 0x1F0006
	cmdbuf[1]=IPC_Desc_StaticBuffer(sizeof(udsNetworkStruct), 1);
	cmdbuf[2]=(u32)network;
	cmdbuf[3]=IPC_Desc_StaticBuffer(tagsize, 2);
	cmdbuf[4]=(u32)tag0;
	cmdbuf[5]=IPC_Desc_StaticBuffer(tagsize, 3);
	cmdbuf[6]=(u32)tag1;

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(0x280,0);
	staticbufs[1] = (u32)out;

	Result ret=0;
	ret=svcSendSyncRequest(__uds_servhandle);

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	if(R_FAILED(ret))return ret;

	return cmdbuf[1];
}
Пример #5
0
int getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
	int ret = 0;
	u32 *cmdbuf = getThreadCommandBuffer();
	u32 saved_threadstorage[2];
	u8 tmpaddr[0x1c];

	sockfd = soc_get_fd(sockfd);
	if(sockfd < 0)	{
		errno = -sockfd;
		return -1;
	}

	cmdbuf[0] = IPC_MakeHeader(0x17,2,2); // 0x170082
	cmdbuf[1] = (u32)sockfd;
	cmdbuf[2] = 0x1c;
	cmdbuf[3] = IPC_Desc_CurProcessHandle();

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(0x1c,0);
	staticbufs[1] = (u32)tmpaddr;

	ret = svcSendSyncRequest(SOCU_handle);

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	if(ret != 0) {
		errno = SYNC_ERROR;
		return ret;
	}

	ret = (int)cmdbuf[1];
	if(ret == 0)
		ret = _net_convert_error(cmdbuf[2]);

	if(ret < 0) {
		errno = -ret;
		return -1;
	}

	if(*addrlen > tmpaddr[0])
		*addrlen = tmpaddr[0];
	memset(addr, 0, sizeof(struct sockaddr));
	addr->sa_family = tmpaddr[1];
	memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);

	return ret;
}
Пример #6
0
int socAccept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
    Result ret = 0;
    int tmp_addrlen = 0x1c;

    u32 *cmdbuf = getThreadCommandBuffer();
    u8 tmpaddr[0x1c];
    u32 saved_threadstorage[2];

    memset(tmpaddr, 0, 0x1c);

    cmdbuf[0] = IPC_MakeHeader(0x4,2,2); // 0x40082
    cmdbuf[1] = (u32)sockfd;
    cmdbuf[2] = (u32)tmp_addrlen;
    cmdbuf[3] = IPC_Desc_CurProcessHandle();

    u32 *staticbufs = getThreadStaticBuffers();
    saved_threadstorage[0] = staticbufs[0];
    saved_threadstorage[1] = staticbufs[1];

    staticbufs[0] = IPC_Desc_StaticBuffer(tmp_addrlen,0);
    staticbufs[1] = (u32)tmpaddr;

    ret = svcSendSyncRequest(SOCU_handle);

    staticbufs[0] = saved_threadstorage[0];
    staticbufs[1] = saved_threadstorage[1];

    if(ret != 0)
        return ret;

    ret = (int)cmdbuf[1];
    if(ret == 0)
        ret = _net_convert_error(cmdbuf[2]);

    if(ret < 0)
        //errno = -ret;

    if(ret >= 0 && addr != NULL)
    {
        addr->sa_family = tmpaddr[1];
        if(*addrlen > tmpaddr[0])
            *addrlen = tmpaddr[0];
        memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
    }

    if(ret < 0)
        return -1;

    return ret;
}
Пример #7
0
int socPoll(struct pollfd *fds, nfds_t nfds, int timeout)
{
    int ret = 0;
    nfds_t i;
    u32 size = sizeof(struct pollfd)*nfds;
    u32 *cmdbuf = getThreadCommandBuffer();
    u32 saved_threadstorage[2];

    if(nfds == 0) {
        return -1;
    }

    for(i = 0; i < nfds; ++i) {
        fds[i].revents = 0;
    }

    cmdbuf[0] = IPC_MakeHeader(0x14,2,4); // 0x140084
    cmdbuf[1] = (u32)nfds;
    cmdbuf[2] = (u32)timeout;
    cmdbuf[3] = IPC_Desc_CurProcessHandle();
    cmdbuf[5] = IPC_Desc_StaticBuffer(size,10);
    cmdbuf[6] = (u32)fds;

    u32 * staticbufs = getThreadStaticBuffers();
    saved_threadstorage[0] = staticbufs[0];
    saved_threadstorage[1] = staticbufs[1];

    staticbufs[0] = IPC_Desc_StaticBuffer(size,0);
    staticbufs[1] = (u32)fds;

    ret = svcSendSyncRequest(SOCU_handle);

    staticbufs[0] = saved_threadstorage[0];
    staticbufs[1] = saved_threadstorage[1];

    if(ret != 0) {
        return ret;
    }

    ret = (int)cmdbuf[1];
    if(ret == 0)
        ret = _net_convert_error(cmdbuf[2]);

    if(ret < 0) {
        //errno = -ret;
        return -1;
    }

    return ret;
}
Пример #8
0
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen)
{
	int ret = 0;
	u32 *cmdbuf = getThreadCommandBuffer();
	u32 saved_threadstorage[2];

	sockfd = soc_get_fd(sockfd);
	if(sockfd < 0) {
		errno = -sockfd;
		return -1;
	}

	cmdbuf[0] = IPC_MakeHeader(0x11,4,2); // 0x110102
	cmdbuf[1] = (u32)sockfd;
	cmdbuf[2] = (u32)level;
	cmdbuf[3] = (u32)optname;
	cmdbuf[4] = (u32)*optlen;
	cmdbuf[5] = IPC_Desc_CurProcessHandle();

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(*optlen,0);
	staticbufs[1] = (u32)optval;

	ret = svcSendSyncRequest(SOCU_handle);

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	if(ret != 0) {
		errno = SYNC_ERROR;
		return ret;
	}

	ret = (int)cmdbuf[1];
	if(ret == 0)
		ret = _net_convert_error(cmdbuf[2]);

	if(ret < 0) {
		errno = -ret;
		return -1;
	}

	*optlen = cmdbuf[3];

	return ret;
}
Пример #9
0
Result ACI_GetPassphrase(char * passphrase)
{
	u32* cmdbuf = getThreadCommandBuffer();
	
	cmdbuf[0] = IPC_MakeHeader(0x415,0,0); // 0x04150000
	
	u32* staticbufs = getThreadStaticBuffers();
	
	staticbufs[0] = IPC_Desc_StaticBuffer(0x40, 0); //passphrase length is 0x40
	staticbufs[1] = (u32)passphrase;
	
	Result ret = 0;
	if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
	
	return (Result)cmdbuf[1];
}
Пример #10
0
Result ACI_GetSSID(char * ssid)
{
	u32* cmdbuf = getThreadCommandBuffer();
	
	cmdbuf[0] = IPC_MakeHeader(0x40F,0,0); // 0x040F0000
	
	u32* staticbufs = getThreadStaticBuffers();
	
	staticbufs[0] = IPC_Desc_StaticBuffer(0x20, 0); //SSID length is 0x20
	staticbufs[1] = (u32)ssid;
	
	Result ret = 0;
	if(R_FAILED(ret = svcSendSyncRequest(acHandle))) return ret;
	
	return (Result)cmdbuf[1];
}
Пример #11
0
Result APT_ReceiveParameter(NS_APPID appID, u32 bufferSize, u32* buffer, u32* actualSize, u8* signalType)
{
	u32* cmdbuf=getThreadCommandBuffer();
	cmdbuf[0]=IPC_MakeHeader(0xD,2,0); // 0xD0080
	cmdbuf[1]=appID;
	cmdbuf[2]=bufferSize;

	u32 *staticbufs = getThreadStaticBuffers();
	staticbufs[0]=IPC_Desc_StaticBuffer(bufferSize,0);
	staticbufs[1]=(u32)buffer;
	
	Result ret=0;
	if(R_FAILED(ret=svcSendSyncRequest(aptuHandle)))return ret;

	if(signalType)*signalType=cmdbuf[3];
	if(actualSize)*actualSize=cmdbuf[4];

	return cmdbuf[1];
}
Пример #12
0
Result LOADER_GetProgramInfo(ExHeader_Info* exheaderInfo, u64 programHandle)
{
	Result ret = 0;
	u32 *cmdbuf = getThreadCommandBuffer();
	u32 *staticbufs = getThreadStaticBuffers();

	cmdbuf[0] = IPC_MakeHeader(4, 2, 0); // 0x40080
	cmdbuf[1] = (u32)programHandle;
	cmdbuf[2] = (u32)(programHandle >> 32);

	u32 staticbufscpy[2] = {staticbufs[0], staticbufs[1]};
	staticbufs[0] = IPC_Desc_StaticBuffer(0x400, 0);
	staticbufs[1] = (u32)exheaderInfo;

	if(R_FAILED(ret = svcSendSyncRequest(loaderHandle))) return ret;

	staticbufs[0] = staticbufscpy[0];
	staticbufs[1] = staticbufscpy[1];

	return (Result)cmdbuf[1];
}
Пример #13
0
Result udsPullPacket(const udsBindContext *bindcontext, void *buf, size_t size, size_t *actual_size, u16 *src_NetworkNodeID)
{
	u32* cmdbuf=getThreadCommandBuffer();
	u32 saved_threadstorage[2];

	u32 aligned_size = (size+0x3) & ~0x3;

	cmdbuf[0]=IPC_MakeHeader(0x14,3,0); // 0x1400C0
	cmdbuf[1]=bindcontext->BindNodeID;
	cmdbuf[2]=aligned_size>>2;
	cmdbuf[3]=size;

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(aligned_size,0);
	staticbufs[1] = (u32)buf;

	Result ret=0;
	ret=svcSendSyncRequest(__uds_servhandle);

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	if(R_FAILED(ret))return ret;

	ret = cmdbuf[1];

	if(R_SUCCEEDED(ret))
	{
		if(actual_size)*actual_size = cmdbuf[2];
		if(src_NetworkNodeID)*src_NetworkNodeID = cmdbuf[3];
	}

	return ret;
}
Пример #14
0
static int getaddrinfo_detail(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res, addrinfo_3ds_t *info, s32 info_count, s32 * count)
{
	int            i;
	u32            *cmdbuf = getThreadCommandBuffer();
	u32            saved_threadstorage[2];

	if(node == NULL && service == NULL)
	{
		return EAI_NONAME;
	}

	cmdbuf[ 0] = IPC_MakeHeader(0xF,4,6); // 0x00F0106
	cmdbuf[ 1] = node    == NULL ? 0 : strlen(node)+1;
	cmdbuf[ 2] = service == NULL ? 0 : strlen(service)+1;
	cmdbuf[ 3] = hints   == NULL ? 0 : sizeof(*hints);
	cmdbuf[ 4] = sizeof(addrinfo_3ds_t) * info_count;
	cmdbuf[ 5] = IPC_Desc_StaticBuffer(cmdbuf[1], 5);
	cmdbuf[ 6] = (u32)node;
	cmdbuf[ 7] = IPC_Desc_StaticBuffer(cmdbuf[2], 6);
	cmdbuf[ 8] = (u32)service;
	cmdbuf[ 9] = IPC_Desc_StaticBuffer(cmdbuf[3], 7);
	cmdbuf[10] = (u32)hints;

	u32 * staticbufs = getThreadStaticBuffers();

	// Save the thread storage values
	for(i = 0 ; i < 2 ; ++i)
		saved_threadstorage[i] = staticbufs[i];

	staticbufs[0] = IPC_Desc_StaticBuffer(sizeof(addrinfo_3ds_t) * info_count, 0);
	staticbufs[1] = (u32)info;

	int ret = svcSendSyncRequest(SOCU_handle);

	// Restore the thread storage values
	for(i = 0 ; i < 2 ; ++i)
		staticbufs[i] = saved_threadstorage[i];

	if(R_FAILED(ret)) {
		errno = SYNC_ERROR;
		return ret;
	}

	ret = cmdbuf[1];
	if(R_FAILED(ret)) {
		errno = SYNC_ERROR;
		return ret;
	}
	if(cmdbuf[2] != 0)
	{
		return cmdbuf[2];
	}

	*count = cmdbuf[3];
	if(*count <= 0)
		*res = NULL;
	else if(*count <= info_count)
	{
		struct addrinfo **ptr = res;
		for(i = 0; i < *count; ++i)
		{
			*ptr = buffer2addrinfo(&info[i]);
			if(*ptr == NULL)
			{
				freeaddrinfo(*res);
				*res = NULL;
				return EAI_MEMORY;
			}
			ptr = &(*ptr)->ai_next;
		}
		*ptr = NULL;
	}

	return 0;
}
Пример #15
0
struct hostent* gethostbyname(const char *name)
{
	int ret = 0;
	u32 *cmdbuf = getThreadCommandBuffer();
	u32 saved_threadstorage[2];
	static u8 outbuf[0x1A88];

	h_errno = 0;

	cmdbuf[0] = IPC_MakeHeader(0xD,2,2); // 0xD0082
	cmdbuf[1] = strlen(name)+1;
	cmdbuf[2] = sizeof(outbuf);
	cmdbuf[3] = ((strlen(name)+1) << 14) | 0xC02;
	cmdbuf[4] = (u32)name;

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(sizeof(outbuf),0);
	staticbufs[1] = (u32)outbuf;

	ret = svcSendSyncRequest(SOCU_handle);
	if(ret != 0) {
		h_errno = NO_RECOVERY;
		return NULL;
	}

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	ret = (int)cmdbuf[1];
	if(ret == 0)
		ret = _net_convert_error(cmdbuf[2]);

        if(ret < 0) {
		/* TODO: set h_errno based on ret */
		h_errno = HOST_NOT_FOUND;
		return NULL;
	}

	u32 num_results, i;
	memcpy(&num_results, (char*)outbuf+4, sizeof(num_results));
	if(num_results > MAX_HOSTENT_RESULTS)
		num_results = MAX_HOSTENT_RESULTS;

	SOC_hostent.h_name      = (char*)outbuf + 8;
	SOC_hostent.h_aliases   = &SOC_hostent_alias;
	SOC_hostent.h_addrtype  = AF_INET;
	SOC_hostent.h_length    = 4;
	SOC_hostent.h_addr_list = SOC_hostent_results;

	SOC_hostent_alias = NULL;

	for(i = 0; i < num_results; ++i)
		SOC_hostent_results[i] = (char*)outbuf + 0x1908 + i*0x10;
	SOC_hostent_results[num_results] = NULL;

	SOC_hostent.h_addr = SOC_hostent.h_addr_list[0];

	return &SOC_hostent;
}
Пример #16
0
int poll(struct pollfd *fds, nfds_t nfds, int timeout)
{
	int ret = 0;
	nfds_t i;
	u32 size = sizeof(struct pollfd)*nfds;
	u32 *cmdbuf = getThreadCommandBuffer();
	u32 saved_threadstorage[2];

	if(nfds == 0) {
		errno = EINVAL;
		return -1;
	}

	struct pollfd *tmp_fds = (struct pollfd*)malloc(sizeof(struct pollfd) * nfds);
	if(tmp_fds == NULL) {
		errno = ENOMEM;
		return -1;
	}

	memcpy(tmp_fds, fds, sizeof(struct pollfd) * nfds);

	for(i = 0; i < nfds; ++i) {
		tmp_fds[i].fd = soc_get_fd(fds[i].fd);
		if(tmp_fds[i].fd < 0) {
			errno = -tmp_fds[i].fd;
			free(tmp_fds);
			return -1;
		}
		tmp_fds[i].revents = 0;
	}

	cmdbuf[0] = IPC_MakeHeader(0x14,2,4); // 0x140084
	cmdbuf[1] = (u32)nfds;
	cmdbuf[2] = (u32)timeout;
	cmdbuf[3] = IPC_Desc_CurProcessHandle();
	cmdbuf[5] = IPC_Desc_StaticBuffer(size,10);
	cmdbuf[6] = (u32)tmp_fds;

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(size,0);
	staticbufs[1] = (u32)tmp_fds;

	ret = svcSendSyncRequest(SOCU_handle);
	if(ret != 0) {
		free(tmp_fds);
		errno = SYNC_ERROR;
		return ret;
	}

	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];

	ret = (int)cmdbuf[1];
	if(ret == 0)
		ret = _net_convert_error(cmdbuf[2]);

	if(ret < 0) {
		free(tmp_fds);
		errno = -ret;
		return -1;
	}

	for(i = 0; i < nfds; ++i)
		fds[i].revents = tmp_fds[i].revents;

	free(tmp_fds);

	return ret;
}
Пример #17
0
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)
{
	int ret = 0;
	int tmp_addrlen = 0x1c;
	int fd, dev;
	__handle *handle;
	u32 *cmdbuf = getThreadCommandBuffer();
	u8 tmpaddr[0x1c];
	u32 saved_threadstorage[2];

	sockfd = soc_get_fd(sockfd);
	if(sockfd < 0) {
		errno = -sockfd;
		return -1;
	}

	dev = FindDevice("soc:");
	if(dev < 0) {
		errno = ENODEV;
		return -1;
	}

	fd = __alloc_handle(sizeof(__handle) + sizeof(Handle));
	if(fd < 0) {
		errno = ENOMEM;
		return -1;
	}

	handle = __get_handle(fd);
	handle->device = dev;
	handle->fileStruct = ((void *)handle) + sizeof(__handle);

	memset(tmpaddr, 0, 0x1c);

	cmdbuf[0] = IPC_MakeHeader(0x4,2,2); // 0x40082
	cmdbuf[1] = (u32)sockfd;
	cmdbuf[2] = (u32)tmp_addrlen;
	cmdbuf[3] = IPC_Desc_CurProcessHandle();

	u32 * staticbufs = getThreadStaticBuffers();
	saved_threadstorage[0] = staticbufs[0];
	saved_threadstorage[1] = staticbufs[1];

	staticbufs[0] = IPC_Desc_StaticBuffer(tmp_addrlen,0);
	staticbufs[1] = (u32)tmpaddr;

	ret = svcSendSyncRequest(SOCU_handle);
	
	staticbufs[0] = saved_threadstorage[0];
	staticbufs[1] = saved_threadstorage[1];
	
	if(ret != 0) {
		__release_handle(fd);
		errno = SYNC_ERROR;
		return ret;
	}

	ret = (int)cmdbuf[1];
	if(ret == 0)
		ret = _net_convert_error(cmdbuf[2]);

	if(ret < 0)
		errno = -ret;

	if(ret >= 0 && addr != NULL) {
		addr->sa_family = tmpaddr[1];
		if(*addrlen > tmpaddr[0])
			*addrlen = tmpaddr[0];
		memcpy(addr->sa_data, &tmpaddr[2], *addrlen - 2);
	}

	if(ret < 0) {
		__release_handle(fd);
		return -1;
	}
	else
		*(Handle*)handle->fileStruct = ret;

	return fd;
}