/**
@file
@brief 'transport' device
@details Copyright (c) 2017 Acronis International GmbH
@author Mikhail Krivtsov (mikhail.krivtsov@acronis.com)
@since $Id: $
*/
#include "device.h"
#include "debug.h" // DPRINTF
#include "memory.h"
#include "transport.h"
#include "transport_protocol.h"
#include <linux/errno.h> // error codes: ENOMEM
#include <linux/fs.h>
#include <linux/miscdevice.h>
static const struct file_operations operations = {
.owner = THIS_MODULE,
.open = transport_device_open,
#ifdef HAVE_NO_LLSEEK
.llseek = no_llseek,
#endif
.read = transport_device_read,
.write = transport_device_write,
.unlocked_ioctl = transport_device_ioctl,
.release = transport_device_release,
.mmap = transport_device_mmap,
};
static struct miscdevice miscdevice = {
.minor = MISC_DYNAMIC_MINOR,
.name = TRANSPORT_DEVICE_NAME,
.fops = &operations,
};
int __init device_mod_init(void)
{
int ret;
ret = misc_register(&miscdevice);
if (ret) {
EPRINTF("'misc_register()' failure %i", ret);
goto out;
}
DPRINTF("miscdevice.minor=%i", miscdevice.minor);
// Note: 'ret' is already 0 here
out:
return ret;
}
void device_mod_down(void)
{
DPRINTF("");
misc_deregister(&miscdevice);
DPRINTF("");
}
|