static const char *print_a3(const char *val, const rnode *r) { int machine = r->machine, syscall = r->syscall; const char *sys = audit_syscall_to_name(syscall, machine); if (sys) { if (strcmp(sys, "mmap") == 0) return print_mmap(val); else if (strcmp(sys, "mount") == 0) return print_mount(val); else if (strcmp(sys, "recv") == 0) return print_recv(val); else if (strcmp(sys, "recvfrom") == 0) return print_recv(val); else if (strcmp(sys, "recvmmsg") == 0) return print_recv(val); } return strdup(val); }
static const char *print_a2(const char *val, const rnode *r) { int machine = r->machine, syscall = r->syscall; char *out; const char *sys = audit_syscall_to_name(syscall, machine); if (sys) { if (strncmp(sys, "fcntl", 5) == 0) { int ival; errno = 0; ival = strtoul(val, NULL, 16); if (errno) { asprintf(&out, "conversion error(%s)", val); return out; } switch (r->a1) { case F_SETOWN: return print_uid(val, 16); case F_SETFD: if (ival == FD_CLOEXEC) return strdup("FD_CLOEXEC"); /* Fall thru okay. */ case F_SETFL: case F_SETLEASE: case F_GETLEASE: case F_NOTIFY: break; } } else if (strcmp(sys, "openat") == 0) return print_open_flags(val); else if (strcmp(sys, "fchmodat") == 0) return print_mode_short(val); else if (strstr(sys, "chown")) return print_gid(val, 16); else if (strcmp(sys, "setresuid") == 0) return print_uid(val, 16); else if (strcmp(sys, "setresgid") == 0) return print_gid(val, 16); else if (strcmp(sys, "tgkill") == 0) return print_signals(val, 16); else if (strcmp(sys, "mkdirat") == 0) return print_mode_short(val); else if (strcmp(sys, "mmap") == 0) return print_prot(val, 1); else if (strcmp(sys, "mprotect") == 0) return print_prot(val, 0); else if (strcmp(sys, "socket") == 0) return print_socket_proto(val); else if (strcmp(sys, "clone") == 0) return print_clone_flags(val); else if (strcmp(sys, "recvmsg") == 0) return print_recv(val); } return strdup(val); }
void usbip_run (const USB_DEVICE_DESCRIPTOR *dev_dsc) /* simple TCP server */ { struct sockaddr_in serv, cli; int listenfd, sockfd, nb; #ifdef LINUX unsigned int clilen; #else int clilen; #endif unsigned char attached; #ifndef LINUX WSAStartup (wVersionRequested, &wsaData); if (wsaData.wVersion != wVersionRequested) { fprintf (stderr, "\n Wrong version\n"); exit (-1); } #endif if ((listenfd = socket (PF_INET, SOCK_STREAM, 0)) < 0) { printf ("socket error : %s \n", strerror (errno)); exit (1); }; int reuse = 1; if (setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (const char*)&reuse, sizeof(reuse)) < 0) perror("setsockopt(SO_REUSEADDR) failed"); memset (&serv, 0, sizeof (serv)); serv.sin_family = AF_INET; serv.sin_addr.s_addr = htonl (INADDR_ANY); serv.sin_port = htons (TCP_SERV_PORT); if (bind (listenfd, (sockaddr *) & serv, sizeof (serv)) < 0) { printf ("bind error : %s \n", strerror (errno)); exit (1); }; if (listen (listenfd, SOMAXCONN) < 0) { printf ("listen error : %s \n", strerror (errno)); exit (1); }; for (;;) { clilen = sizeof (cli); if ( (sockfd = accept (listenfd, (sockaddr *) & cli, & clilen)) < 0) { printf ("accept error : %s \n", strerror (errno)); exit (1); }; printf("Connection address:%s\n",inet_ntoa(cli.sin_addr)); attached=0; while(1) { if(! attached) { OP_REQ_DEVLIST req; if ((nb = recv (sockfd, (char *)&req, sizeof(OP_REQ_DEVLIST), 0)) != sizeof(OP_REQ_DEVLIST)) { //printf ("receive error : %s \n", strerror (errno)); break; }; #ifdef _DEBUG print_recv((char *)&req, sizeof(OP_REQ_DEVLIST),"OP_REQ_DEVLIST"); #endif req.command=ntohs(req.command); printf("Header Packet\n"); printf("command: 0x%02X\n",req.command); if(req.command == 0x8005) { OP_REP_DEVLIST list; printf("list of devices\n"); handle_device_list(dev_dsc,&list); if (send (sockfd, (char *)&list.header, sizeof(OP_REP_DEVLIST_HEADER), 0) != sizeof(OP_REP_DEVLIST_HEADER)) { printf ("send error : %s \n", strerror (errno)); break; }; if (send (sockfd, (char *)&list.device, sizeof(OP_REP_DEVLIST_DEVICE), 0) != sizeof(OP_REP_DEVLIST_DEVICE)) { printf ("send error : %s \n", strerror (errno)); break; }; if (send (sockfd, (char *)list.interfaces, sizeof(OP_REP_DEVLIST_INTERFACE)*list.device.bNumInterfaces, 0) != sizeof(OP_REP_DEVLIST_INTERFACE)*list.device.bNumInterfaces) { printf ("send error : %s \n", strerror (errno)); break; }; free(list.interfaces); } else if(req.command == 0x8003) { char busid[32]; OP_REP_IMPORT rep; printf("attach device\n"); if ((nb = recv (sockfd, busid, 32, 0)) != 32) { printf ("receive error : %s \n", strerror (errno)); break; }; #ifdef _DEBUG print_recv(busid, 32,"Busid"); #endif handle_attach(dev_dsc,&rep); if (send (sockfd, (char *)&rep, sizeof(OP_REP_IMPORT), 0) != sizeof(OP_REP_IMPORT)) { printf ("send error : %s \n", strerror (errno)); break; }; attached = 1; } } else { printf("------------------------------------------------\n"); printf("handles requests\n"); USBIP_CMD_SUBMIT cmd; USBIP_RET_SUBMIT usb_req; if ((nb = recv (sockfd, (char *)&cmd, sizeof(USBIP_CMD_SUBMIT), 0)) != sizeof(USBIP_CMD_SUBMIT)) { printf ("receive error : %s \n", strerror (errno)); break; }; #ifdef _DEBUG print_recv((char *)&cmd, sizeof(USBIP_CMD_SUBMIT),"USBIP_CMD_SUBMIT"); #endif unpack((int *)&cmd,sizeof(USBIP_CMD_SUBMIT)); printf("usbip cmd %u\n",cmd.command); printf("usbip seqnum %u\n",cmd.seqnum); printf("usbip devid %u\n",cmd.devid); printf("usbip direction %u\n",cmd.direction); printf("usbip ep %u\n",cmd.ep); printf("usbip flags %u\n",cmd.transfer_flags); printf("usbip number of packets %u\n",cmd.number_of_packets); printf("usbip interval %u\n",cmd.interval); #ifdef LINUX printf("usbip setup %llu\n",cmd.setup); #else printf("usbip setup %I64u\n",cmd.setup); #endif printf("usbip buffer lenght %u\n",cmd.transfer_buffer_length); usb_req.command=0; usb_req.seqnum=cmd.seqnum; usb_req.devid=cmd.devid; usb_req.direction=cmd.direction; usb_req.ep=cmd.ep; usb_req.status=0; usb_req.actual_length=0; usb_req.start_frame=0; usb_req.number_of_packets=0; usb_req.error_count=0; usb_req.setup=cmd.setup; if(cmd.command == 1) handle_usb_request(sockfd, &usb_req, cmd.transfer_buffer_length); if(cmd.command == 2) //unlink urb { printf("####################### Unlink URB %u (not working!!!)\n",cmd.transfer_flags); //FIXME /* USBIP_RET_UNLINK ret; printf("####################### Unlink URB %u\n",cmd.transfer_flags); ret.command=htonl(0x04); ret.devid=htonl(cmd.devid); ret.direction=htonl(cmd.direction); ret.ep=htonl(cmd.ep); ret.seqnum=htonl(cmd.seqnum); ret.status=htonl(1); if (send (sockfd, (char *)&ret, sizeof(USBIP_RET_UNLINK), 0) != sizeof(USBIP_RET_UNLINK)) { printf ("send error : %s \n", strerror (errno)); exit(-1); }; */ } if(cmd.command > 2) { printf("Unknown USBIP cmd!\n"); close (sockfd); #ifndef LINUX WSACleanup (); #endif return; }; } } close (sockfd); }; #ifndef LINUX WSACleanup (); #endif };