Esempio n. 1
0
int irda_open(struct gn_statemachine *state)
{
	struct sockaddr_irda peer;
	int fd = -1, daddr;

	daddr = irda_discover_device(state); /* discover the devices */

	if (daddr != -1)  {
		if (!strcasecmp(state->config.port_device, "IrDA:IrCOMM")) {
			fprintf(stderr, _("Virtual IrCOMM device unsupported under Linux\n"));
			return -1;
		}

		fd = socket(AF_IRDA, SOCK_STREAM, 0);	/* Create socket */
		peer.sir_family = AF_IRDA;
		peer.sir_lsap_sel = LSAP_ANY;
		peer.sir_addr = daddr;
		snprintf(peer.sir_name, sizeof(peer.sir_name), "Nokia:PhoNet");

		if (connect(fd, (struct sockaddr *)&peer, sizeof(peer))) {	/* Connect to service "Nokia:PhoNet" */
			perror("connect");
			close(fd);
			fd = -1;
/*		} else { FIXME: It does not work in most cases. Why? Or why it should work?
			recv(fd, NULL, 0, 0);		 call recv first to make select work correctly */
		}
	}

	return fd;
}
Esempio n. 2
0
int irda_open(struct gn_statemachine *state)
{
	WSADATA wsaData;
	SOCKADDR_IRDA peer;
	SOCKET fd = INVALID_SOCKET;
	DWORD daddr = INVALID_DADDR;
	int x = 1;

	/* Initialize */
	if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0) {
		dprintf("WSAStartup() failed.\n");
		fprintf(stderr, _("Failed to initialize socket subsystem: need WINSOCK2. Please upgrade.\n"));
		return -1;
	}
	/* Create an irda socket */
	if ((fd = socket(AF_IRDA, SOCK_STREAM, 0)) < 0) {
		perror("socket");
		dprintf("Failed to create an irda socket.\n");
		return -1;
	}
	/* Discover devices */
	daddr = irda_discover_device(state, fd); /* discover the devices */
	if (daddr == INVALID_DADDR) {
		dprintf("Failed to discover any irda device.\n");
		closesocket(fd);
		return -1;
	}
	/* Prepare socket structure for irda socket */
	peer.irdaAddressFamily = AF_IRDA;
	*(DWORD*)peer.irdaDeviceID = daddr;
	if (!strcasecmp(state->config.port_device, "IrDA:IrCOMM")) {
		snprintf(peer.irdaServiceName, sizeof(peer.irdaServiceName), "IrDA:IrCOMM");
		if (setsockopt(fd, SOL_IRLMP, IRLMP_9WIRE_MODE, (char *)&x, sizeof(x)) == SOCKET_ERROR) {
			perror("setsockopt");
			dprintf("Failed to set irda socket options.\n");
			closesocket(fd);
			return -1;
		}
	} else
		snprintf(peer.irdaServiceName, sizeof(peer.irdaServiceName), "Nokia:PhoNet");
	/* Connect to the irda socket */
	if (connect(fd, (struct sockaddr *)&peer, sizeof(peer))) {	/* Connect to service "Nokia:PhoNet" */
		perror("connect");
		dprintf("Failed to connect to irda socket\n");
		closesocket(fd);
		return -1;
	}
	return (int)fd;
}