/* libusb(5): * Interrupt transfers. */ int usb_interrupt_write(usb_dev_handle *dev, int ep, usb_buf_t bytes, int size, int timeout) { // Get remote fd Packet* pkt = pkt_claim(); int fd = session_get(); // Prepare packet pkt_init(pkt, UsbInterruptWrite); pkt_addint(pkt, dev->fd); pkt_addint(pkt, ep); pkt_addstr(pkt, size, bytes); pkt_addint(pkt, timeout); pkt_send(pkt, fd); // Get response int res = -1; if(pkt_recv(fd, pkt) > 0 && pkt_op(pkt) == UsbInterruptWrite) { Iterator it; pkt_begin(pkt, &it); res = iter_getint(&it); } // Return response pkt_release(); debug_msg("returned %d", res); return res; }
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, int value, int index, char *bytes, int size, int timeout) { // Get remote fd Packet* pkt = pkt_claim(); int fd = session_get(); // Prepare packet pkt_init(pkt, UsbControlMsg); pkt_addint(pkt, dev->fd); pkt_addint(pkt, requesttype); pkt_addint(pkt, request); pkt_addint(pkt, value); pkt_addint(pkt, index); pkt_addstr(pkt, size, bytes); pkt_addint(pkt, timeout); pkt_send(pkt, fd); // Get response int res = -1; if(pkt_recv(fd, pkt) > 0 && pkt_op(pkt) == UsbControlMsg) { Iterator it; pkt_begin(pkt, &it); res = iter_getint(&it); if(res > 0) { int minlen = (res > size) ? size : res; memcpy(bytes, it.val, minlen); } } // Return response pkt_release(); debug_msg("returned %d", res); return res; }
/* PROTO */ IRCLIB_RET irclib_connect(void *handle, char *server, uint16_t port) { IRCLIB *hptr = (IRCLIB *) handle; pkt_t *connectpkt; pkt_t *nickpkt; #ifdef MACINTOSH_CLASSIC #else struct sockaddr_in sin; struct hostent *he; if ((he = gethostbyname(server)) == NULL) { perror("gethostbyname()"); return IRCLIB_RET_ERROR; } if ((hptr->sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket()"); return IRCLIB_RET_ERROR; } sin.sin_family = AF_INET; sin.sin_port = htons(port); sin.sin_addr = *((struct in_addr *) he->h_addr); memset(&(sin.sin_zero), 0, 8); if (connect(hptr->sock, (struct sockaddr *) & sin, sizeof(struct sockaddr)) == -1) { perror("connect()"); return IRCLIB_RET_ERROR; } #endif /* The hostname and servername sent here are typically unused. * However, if we send "x", some servers detect us as a spambot * and refuse the connection, so we reuse the username instead. */ connectpkt = pkt_init(5 + strlen(hptr->username) + 1 + strlen(hptr->username) + 1 + strlen(hptr->username) + 1 + strlen(hptr->realname) + 3); pkt_addstr(connectpkt, "USER "); pkt_addstr(connectpkt, hptr->username); pkt_addstr(connectpkt, " "); pkt_addstr(connectpkt, hptr->username); /* hostname */ pkt_addstr(connectpkt, " "); pkt_addstr(connectpkt, hptr->username); /* servername */ pkt_addstr(connectpkt, " :"); pkt_addstr(connectpkt, hptr->realname); pkt_addstr(connectpkt, "\r\n"); sendPkt(handle, connectpkt); pkt_free(connectpkt); nickpkt = pkt_init(7 + strlen(hptr->nickname)); pkt_addstr(nickpkt, "NICK "); pkt_addstr(nickpkt, hptr->nickname); pkt_addstr(nickpkt, "\r\n"); sendPkt(handle, nickpkt); pkt_free(nickpkt); hptr->connected = 1; return IRCLIB_RET_OK; }