Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/share/examples/kld/cdev/module/cdev.c
39553 views
1
/* 08 Nov 1998*/
2
/*-
3
* cdev.c
4
*
5
* 08 Nov 1998 Rajesh Vaidheeswarran
6
*
7
* SPDX-License-Identifier: BSD-4-Clause
8
*
9
* Copyright (c) 1998 Rajesh Vaidheeswarran
10
* All rights reserved.
11
*
12
* Redistribution and use in source and binary forms, with or without
13
* modification, are permitted provided that the following conditions
14
* are met:
15
* 1. Redistributions of source code must retain the above copyright
16
* notice, this list of conditions and the following disclaimer.
17
* 2. Redistributions in binary form must reproduce the above copyright
18
* notice, this list of conditions and the following disclaimer in the
19
* documentation and/or other materials provided with the distribution.
20
* 3. All advertising materials mentioning features or use of this software
21
* must display the following acknowledgement:
22
* This product includes software developed by Rajesh Vaidheeswarran.
23
* 4. The name Rajesh Vaidheeswarran may not be used to endorse or promote
24
* products derived from this software without specific prior written
25
* permission.
26
*
27
* THIS SOFTWARE IS PROVIDED BY RAJESH VAIDHEESWARRAN ``AS IS'' AND ANY
28
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30
* ARE DISCLAIMED. IN NO EVENT SHALL THE RAJESH VAIDHEESWARRAN BE LIABLE
31
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
32
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
33
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
34
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
35
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
36
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37
* SUCH DAMAGE.
38
*
39
* Copyright (c) 1993 Terrence R. Lambert.
40
* All rights reserved.
41
*
42
* Redistribution and use in source and binary forms, with or without
43
* modification, are permitted provided that the following conditions
44
* are met:
45
* 1. Redistributions of source code must retain the above copyright
46
* notice, this list of conditions and the following disclaimer.
47
* 2. Redistributions in binary form must reproduce the above copyright
48
* notice, this list of conditions and the following disclaimer in the
49
* documentation and/or other materials provided with the distribution.
50
* 3. All advertising materials mentioning features or use of this software
51
* must display the following acknowledgement:
52
* This product includes software developed by Terrence R. Lambert.
53
* 4. The name Terrence R. Lambert may not be used to endorse or promote
54
* products derived from this software without specific prior written
55
* permission.
56
*
57
* THIS SOFTWARE IS PROVIDED BY TERRENCE R. LAMBERT ``AS IS'' AND ANY
58
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
59
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
60
* ARE DISCLAIMED. IN NO EVENT SHALL THE TERRENCE R. LAMBERT BE LIABLE
61
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
62
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
63
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
64
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
65
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
66
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
67
* SUCH DAMAGE.
68
*
69
*/
70
#include <sys/param.h>
71
#include <sys/uio.h>
72
#include <sys/proc.h>
73
#include <sys/systm.h>
74
#include <sys/ioccom.h>
75
#include <sys/conf.h>
76
77
#include "cdev.h"
78
79
/*
80
* This is the actual code for the system call... it can't be static because
81
* it is exported to another part of the module... the only place it needs
82
* to be referenced is the sysent we are interested in.
83
*
84
* To write your own system call using this as a template, you could strip
85
* out this code and use the rest as a prototype module, changing only the
86
* function names and the number of arguments to the call in the module
87
* specific "sysent".
88
*
89
* You would have to use the "-R" option of "ld" to ensure a linkable file
90
* if you were to do this, since you would need to combine multiple ".o"
91
* files into a single ".o" file for use by "modload".
92
*/
93
94
#define CDEV_IOCTL1 _IOR('C', 1, u_int)
95
96
/* Stores string recv'd by _write() */
97
static char buf[512+1];
98
static size_t len;
99
100
int
101
mydev_open(struct cdev *dev, int flag, int otyp, struct thread *td)
102
{
103
struct proc *procp = td->td_proc;
104
105
printf("mydev_open: dev_t=%lu, flag=%x, otyp=%x, procp=%p\n",
106
dev2udev(dev), flag, otyp, procp);
107
memset(&buf, '\0', 513);
108
len = 0;
109
return (0);
110
}
111
112
int
113
mydev_close(struct cdev *dev, int flag, int otyp, struct thread *td)
114
{
115
struct proc *procp = td->td_proc;
116
117
printf("mydev_close: dev_t=%lu, flag=%x, otyp=%x, procp=%p\n",
118
dev2udev(dev), flag, otyp, procp);
119
return (0);
120
}
121
122
int
123
mydev_ioctl(struct cdev *dev, u_long cmd, caddr_t arg, int mode,
124
struct thread *td)
125
{
126
int error = 0;
127
struct proc *procp = td->td_proc;
128
129
printf("mydev_ioctl: dev_t=%lu, cmd=%lx, arg=%p, mode=%x procp=%p\n",
130
dev2udev(dev), cmd, arg, mode, procp);
131
132
switch(cmd) {
133
case CDEV_IOCTL1:
134
printf("you called mydev_ioctl CDEV_IOCTL1\n");
135
break;
136
default:
137
printf("No such ioctl for me!\n");
138
error = EINVAL;
139
break;
140
}
141
return (error);
142
}
143
144
/*
145
* mydev_write takes in a character string and saves it
146
* to buf for later accessing.
147
*/
148
int
149
mydev_write(struct cdev *dev, struct uio *uio, int ioflag)
150
{
151
int err = 0;
152
153
printf("mydev_write: dev_t=%lu, uio=%p, ioflag=%d\n",
154
dev2udev(dev), uio, ioflag);
155
156
err = copyinstr(uio->uio_iov->iov_base, &buf, 512, &len);
157
if (err != 0) {
158
printf("Write to \"cdev\" failed.\n");
159
}
160
return(err);
161
}
162
163
/*
164
* The mydev_read function just takes the buf that was saved
165
* via mydev_write() and returns it to userland for
166
* accessing.
167
*/
168
int
169
mydev_read(struct cdev *dev, struct uio *uio, int ioflag)
170
{
171
int err = 0;
172
173
printf("mydev_read: dev_t=%lu, uio=%p, ioflag=%d\n",
174
dev2udev(dev), uio, ioflag);
175
176
if (len <= 0) {
177
err = -1;
178
} else { /* copy buf to userland */
179
copystr(&buf, uio->uio_iov->iov_base, 513, &len);
180
}
181
return(err);
182
}
183
184