X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fkernel%2Fsamples%2Fchar2%2F.git;a=blobdiff_plain;f=hellochar.c;h=940bfeb837b7ca7ddcbd43aebaa496845a871ae2;hp=a8473920d829a63f383554973541c290bbd54649;hb=HEAD;hpb=10c2d46c6408882fd1eec0b1d59a5dec086040c2 diff --git a/hellochar.c b/hellochar.c index a847392..940bfeb 100644 --- a/hellochar.c +++ b/hellochar.c @@ -25,6 +25,7 @@ #include #include #include +#include MODULE_LICENSE("GPL"); @@ -116,6 +117,21 @@ static const struct file_operations hello_fops = { .write = hello_write, }; +static ssize_t hello_len_show(struct device *dev, struct device_attribute *attr, + char *buffer) +{ + size_t len = CIRC_CNT(hello->head, hello->tail, MAXLEN); + return sprintf(buffer, "%d\n", len); +} + +static const struct device_attribute hello_len_attr = { + .attr = { .name = "len", .mode = 0444, }, + .show = hello_len_show, +}; + +static struct class *hello_class; +static struct device *hello_dev; + static int __init ch_init(void) { int r = 0; @@ -125,11 +141,24 @@ static int __init ch_init(void) r = -ENOMEM; goto out; } + hello_class = class_create(THIS_MODULE, "hello"); + if (IS_ERR(hello_class)) { + r = PTR_ERR(hello_class); + goto class_out; + } memcpy(hello->buf, default_greeting, sizeof(default_greeting)); hello->head = sizeof(default_greeting); r = alloc_chrdev_region(&devnum, 0, 256, "hello"); if (r) goto reg_out; + hello_dev = device_create(hello_class, NULL, devnum, NULL, "hello"); + if (!hello_dev) { + r = -ENODEV; + goto dev_out; + } + r = device_create_file(hello_dev, &hello_len_attr); + if (r) + goto file_out; dev = cdev_alloc(); if (!dev) { r = -ENOMEM; @@ -143,8 +172,14 @@ static int __init ch_init(void) add_out: kfree(dev); cdev_out: + device_remove_file(hello_dev, &hello_len_attr); +file_out: + device_destroy(hello_class, devnum); +dev_out: unregister_chrdev_region(devnum, 256); reg_out: + class_destroy(hello_class); +class_out: kfree(hello); out: return r; @@ -153,8 +188,11 @@ out: static void __exit ch_exit(void) { cdev_del(dev); + device_remove_file(hello_dev, &hello_len_attr); + device_destroy(hello_class, devnum); unregister_chrdev_region(devnum, 256); kfree(hello->buf); + class_destroy(hello_class); } module_init(ch_init);