/*
 *  ioctl.c
 *
 *  Copyright (C) 1995, 1996 by Volker Lendecke
 *  Copyright (C) 1997 by Volker Lendecke
 *
 *  Please add a note about your changes to smbfs in the ChangeLog file.
 */

#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/time.h>
#include <linux/mm.h>
#include <linux/highuid.h>
#include <linux/smp_lock.h>
#include <linux/net.h>

#include <linux/smb_fs.h>
#include <linux/smb_mount.h>

#include <asm/uaccess.h>

#include "proto.h"

long
smb_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
	struct smb_sb_info *server = server_from_inode(filp->f_path.dentry->d_inode);
	struct smb_conn_opt opt;
	int result = -EINVAL;

	lock_kernel();
	switch (cmd) {
		uid16_t uid16;
		uid_t uid32;
	case SMB_IOC_GETMOUNTUID:
		SET_UID(uid16, server->mnt->mounted_uid);
		result = put_user(uid16, (uid16_t __user *) arg);
		break;
	case SMB_IOC_GETMOUNTUID32:
		SET_UID(uid32, server->mnt->mounted_uid);
		result = put_user(uid32, (uid_t __user *) arg);
		break;

	case SMB_IOC_NEWCONN:
		/* arg is smb_conn_opt, or NULL if no connection was made */
		if (!arg) {
			result = 0;
			smb_lock_server(server);
			server->state = CONN_RETRIED;
			printk(KERN_ERR "Connection attempt failed!  [%d]\n",
			       server->conn_error);
			smbiod_flush(server);
			smb_unlock_server(server);
			break;
		}

		result = -EFAULT;
		if (!copy_from_user(&opt, (void __user *)arg, sizeof(opt)))
			result = smb_newconn(server, &opt);
		break;
	default:
		break;
	}
	unlock_kernel();

	return result;
}
