コード例 #1
0
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 */
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}