static int i_peek(u_int fd, struct file *fp, struct inode *ip, void *data, struct pt_regs *regs) { #if !defined(CONFIG_ABI_XTI) fput(fp); return 0; #else struct T_private *ti = Priv(fp); struct T_primsg *tp; struct strpeek buf, *uap = data; int error = -EFAULT; if (copy_from_user(&buf, uap, sizeof(buf))) goto fput; error = 0; if (!ip->i_sock) goto fput; if (IS_SOCKSYS(ip)) timod_update_socket(fd, fp, regs); if (!ti || !ti->pfirst) goto fput; tp = ti->pfirst; error = -EFAULT; if (!buf.flags || buf.flags == tp->pri) { int l; if (buf.ctl.maxlen <= tp->length) l = buf.ctl.maxlen; else l = tp->length; if (copy_to_user(buf.ctl.buf, ((char *)&tp->type) + ti->offset, l)) goto fput; if (put_user(l, &uap->ctl.len)) goto fput; if (buf.dat.maxlen >= 0 && put_user(0, &uap->dat.len)) goto fput; if (put_user(tp->pri, &uap->flags)) goto fput; error = 1; } fput: fput(fp); return error; #endif /* CONFIG_ABI_XTI */ }
static int i_nread(u_int fd, struct file *fp, struct inode *ip, void *data, struct pt_regs *regs) { int error=0; if (!access_ok(VERIFY_WRITE, data, sizeof(u_long))) { error = -EFAULT; goto fput; } #if !defined(CONFIG_ABI_XTI) if (S_ISSOCK(ip->i_mode)) { struct T_private *ti = Priv(fp); if (IS_SOCKSYS(ip)) timod_update_socket(fd, fp, regs); if (ti && ti->pfirst) { put_user(ti->pfirst->length, (u_long *)data); fput(fp); return 1; /* at least 1... (FIXME) */ } } fput(fp); #endif error = SYS(ioctl,fd, TIOCINQ, (long)data); if (error == -EINVAL) return 0; else if (error) return error; __get_user(error, (u_long *)data); return !!error; fput: fput(fp); return error; }
static int i_nread(u_int fd, struct file *fp, struct inode *ip, void *data, struct pt_regs *regs) { int error; error = verify_area(VERIFY_WRITE, data, sizeof(u_long)); if (error) goto fput; #if defined(CONFIG_ABI_XTI) if (ip->i_sock) { struct T_private *ti = Priv(fp); if (IS_SOCKSYS(ip)) timod_update_socket(fd, fp, regs); if (ti && ti->pfirst) { put_user(ti->pfirst->length, (u_long *)data); fput(fp); return 1; /* at least 1... (FIXME) */ } } #endif fput(fp); error = sys_ioctl(fd, TIOCINQ, data); if (error == -EINVAL) return 0; else if (error) return error; __get_user(error, (u_long *)data); return !!error; fput: fput(fp); return error; }