// allocate memory for interrupt delivery channel structure and initialize. // returns NULL on memory exhausted. static irq_chan* ich_ctor(File* file, int sig, int flags) { register irq_chan* ich; assert_retval(irq_file(file) < NR_IRQS, NULL); ich=kmalloc(sizeof(irq_chan), GFP_KERNEL); if (ich!=NULL) { #ifndef NDEBUG ich->signature=ICH_SIG; #endif ich->file=file; file->private_data = ich; ich->irq=irq_file(file); ich->tch=NULL; ich->sig=sig; ich->flags=flags; ich->devname=NULL; init_waitqueue_head(&ich->wqh); ich->irq_count=0; ich->sig_count=0; ich->sel_count=0; ich->skipping_count=0; } PREFIX(); PRDEBUG("ich=%p ich=", ich); ICH_PRINT(ich); PRENDL(); return ich; }
static int irq_open(Inode* inode, File* file) { PREFIX(); PFX(irq_inode(inode)); PRDEBUG("opening by %d...\n", current->pid); if (irq_inode(inode)>=NR_IRQS && irq_inode(inode)!=PCI_MINOR) return -ENXIO; #if 0 if (file->f_flags & ~O_ACCMODE) return -EINVAL; #endif file->private_data=NULL; MOD_INC_USE_COUNT; PREFIX(); PFX(irq_inode(inode)); PRDEBUG("opened by %d\n", current->pid); PREFIX(); TCHLIST_PRINT(); return 0; }
/* return value: = 0: OK = -1: ERROR */ int tcp_connect(int *remotesocket_fd, struct sockaddr_in *addr, int *connect_error) { int result; char text[255]; int try; sprintf(text, "connecting to remotesocket %d on port %d ip %s\n", remotesocket_fd, ntohs(addr->sin_port), inet_ntoa (addr->sin_addr)); PRVERBOSE2("connecting to %s:%d\n", inet_ntoa (addr->sin_addr), ntohs(addr->sin_port)); /* connect to server */ result = connect(*remotesocket_fd, (const struct sockaddr *) addr, sizeof(struct sockaddr_in)); if (result == 0) { PRVERBOSE2("successfully connected to server %s:%d\n", inet_ntoa (addr->sin_addr), ntohs(addr->sin_port)); } else { *connect_error = errno; if ( errno == ECONNREFUSED ) { /*RDEBUG(".");*/ } else { perror(""); } } return result; } /* return value: number of bytes received on socket fd */ int tcp_read(void *buffer, unsigned size, int fd, unsigned long maxSDUsize) { int r; unsigned s = size; char *pos = (char *) buffer; FN_IN_DEBUG("tcp_read"); do { r = recv(fd, pos, s, 0); if (r == 0) PRDEBUG("tcp_read: 0 Bytes received\n"); if (r > 0) { s -= r; pos += r; } else { FN_OUT_DEBUG("tcp_read"); return (size - s); } } while (s > 0); FN_OUT_DEBUG("tcp_read"); return (size - s); }
/* return value: number of bytes sent on socket fd */ int tcp_write(void *buffer, unsigned size, int fd, unsigned long maxSDUsize) { int w; unsigned s = size; char *pos = (char *) buffer; FN_IN_DEBUG("tcp_write"); do { w = send(fd, pos, s, 0); if (w == 0) PRDEBUG("tcp_write: 0 Bytes received\n"); if (w > 0) { s -= w; pos += w; } else { FN_OUT_DEBUG("tcp_write"); return (size - s); } } while (s > 0); FN_OUT_DEBUG("tcp_write"); return (size - s); }