⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unix.c

📁 一个Windows下的Linux专用虚拟机
💻 C
字号:
/* * This source code is a part of coLinux source package. * * Dan Aloni <da-x@colinux.org>, 2004 (c) * * The code is licensed under the GPL. See the COPYING file at * the root directory. * */ #include "unix.h"#include <errno.h>#include <unistd.h>#include <fcntl.h>#include <sys/types.h>#include <sys/socket.h>co_rc_t co_os_set_blocking(int sock, bool_t enable){	int ret;	if (enable) {		ret = fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) & (~(O_NONBLOCK)));	} else {		ret = fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) | O_NONBLOCK);	}	if (ret == -1)		return CO_RC(ERROR);	return CO_RC(OK);}bool_t co_os_get_blocking(int sock){	if (fcntl(sock, F_GETFL, 0) & O_NONBLOCK)		return PTRUE;	return PFALSE;}co_rc_t co_os_sendn(int sock, char *data, unsigned long size){	co_rc_t rc = CO_RC(OK);	bool_t blocking;	if (size == 0)		return CO_RC(OK);	blocking = co_os_get_blocking(sock);	co_os_set_blocking(sock, PTRUE);	do {		int sent = write(sock, data, size);		if (sent < 0) {			rc = CO_RC(ERROR);			break;		}		if (sent == 0)			break;		size -= sent;		data += sent;	} while (size > 0);	co_os_set_blocking(sock, blocking);	return rc;}co_rc_t co_os_recv(int sock, char *data, unsigned long size, unsigned long *current_size){	int received;	if (size == *current_size)		return CO_RC(OK);	received = recv(sock, &data[*current_size], size - *current_size, 0);	if (received < 0) {		if (errno == EAGAIN) {			return CO_RC(OK);		}		return CO_RC(ERROR);	}		*current_size += received;	return CO_RC(OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -