Exemple #1
0
/*
 * ioctl()'s on the root directory is the chief method for the daemon to
 * generate kernel reactions
 */
static int autofs4_root_ioctl(struct inode *inode, struct file *filp,
                              unsigned int cmd, unsigned long arg)
{
    struct autofs_sb_info *sbi = autofs4_sbi(inode->i_sb);
    void __user *p = (void __user *)arg;

    DPRINTK("cmd = 0x%08x, arg = 0x%08lx, sbi = %p, pgrp = %u",
            cmd,arg,sbi,process_group(current));

    if ( _IOC_TYPE(cmd) != _IOC_TYPE(AUTOFS_IOC_FIRST) ||
            _IOC_NR(cmd) - _IOC_NR(AUTOFS_IOC_FIRST) >= AUTOFS_IOC_COUNT )
        return -ENOTTY;

    if ( !autofs4_oz_mode(sbi) && !capable(CAP_SYS_ADMIN) )
        return -EPERM;

    switch(cmd) {
    case AUTOFS_IOC_READY:	/* Wait queue: go ahead and retry */
        return autofs4_wait_release(sbi,(autofs_wqt_t)arg,0);
    case AUTOFS_IOC_FAIL:	/* Wait queue: fail with ENOENT */
        return autofs4_wait_release(sbi,(autofs_wqt_t)arg,-ENOENT);
    case AUTOFS_IOC_CATATONIC: /* Enter catatonic mode (daemon shutdown) */
        autofs4_catatonic_mode(sbi);
        return 0;
    case AUTOFS_IOC_PROTOVER: /* Get protocol version */
        return autofs4_get_protover(sbi, p);
    case AUTOFS_IOC_PROTOSUBVER: /* Get protocol sub version */
        return autofs4_get_protosubver(sbi, p);
    case AUTOFS_IOC_SETTIMEOUT:
        return autofs4_get_set_timeout(sbi, p);

    case AUTOFS_IOC_TOGGLEREGHOST:
        return autofs4_toggle_reghost(sbi, p);
    case AUTOFS_IOC_ASKREGHOST:
        return autofs4_ask_reghost(sbi, p);

    case AUTOFS_IOC_ASKUMOUNT:
        return autofs4_ask_umount(filp->f_vfsmnt, p);

    /* return a single thing to expire */
    case AUTOFS_IOC_EXPIRE:
        return autofs4_expire_run(inode->i_sb,filp->f_vfsmnt,sbi, p);
    /* same as above, but can send multiple expires through pipe */
    case AUTOFS_IOC_EXPIRE_MULTI:
        return autofs4_expire_multi(inode->i_sb,filp->f_vfsmnt,sbi, p);

    default:
        return -ENOSYS;
    }
}
Exemple #2
0
/*
 * Send "ready" status for an existing wait (either a mount or an expire
 * request).
 */
static int autofs_dev_ioctl_ready(struct file *fp,
				  struct autofs_sb_info *sbi,
				  struct autofs_dev_ioctl *param)
{
	autofs_wqt_t token;

	token = (autofs_wqt_t) param->ready.token;
	return autofs4_wait_release(sbi, token, 0);
}
Exemple #3
0
/*
 * Send "fail" status for an existing wait (either a mount or an expire
 * request).
 */
static int autofs_dev_ioctl_fail(struct file *fp,
				 struct autofs_sb_info *sbi,
				 struct autofs_dev_ioctl *param)
{
	autofs_wqt_t token;
	int status;

	token = (autofs_wqt_t) param->fail.token;
	status = param->fail.status ? param->fail.status : -ENOENT;
	return autofs4_wait_release(sbi, token, status);
}