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; }
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; }