| 166 | } |
| 167 | |
| 168 | static int |
| 169 | krping_write(struct cdev *dev, struct uio *uio, int ioflag) |
| 170 | { |
| 171 | int err = 0; |
| 172 | int amt; |
| 173 | int remain = BUFFERSIZE; |
| 174 | char *cp; |
| 175 | krping_t *krpingmsg; |
| 176 | |
| 177 | krpingmsg = malloc(sizeof *krpingmsg, M_DEVBUF, M_WAITOK|M_ZERO); |
| 178 | if (!krpingmsg) { |
| 179 | uprintf("Could not malloc mem!\n"); |
| 180 | return ENOMEM; |
| 181 | } |
| 182 | |
| 183 | cp = krpingmsg->msg; |
| 184 | while (uio->uio_resid) { |
| 185 | amt = MIN(uio->uio_resid, remain); |
| 186 | if (amt == 0) |
| 187 | break; |
| 188 | |
| 189 | /* Copy the string in from user memory to kernel memory */ |
| 190 | err = uiomove(cp, amt, uio); |
| 191 | if (err) { |
| 192 | uprintf("Write failed: bad address!\n"); |
| 193 | goto done; |
| 194 | } |
| 195 | cp += amt; |
| 196 | remain -= amt; |
| 197 | } |
| 198 | |
| 199 | if (uio->uio_resid != 0) { |
| 200 | uprintf("Message too big. max size is %d!\n", BUFFERSIZE); |
| 201 | err = EMSGSIZE; |
| 202 | goto done; |
| 203 | } |
| 204 | |
| 205 | /* null terminate and remove the \n */ |
| 206 | cp--; |
| 207 | *cp = 0; |
| 208 | krpingmsg->len = (unsigned long)(cp - krpingmsg->msg); |
| 209 | uprintf("krping: write string = |%s|\n", krpingmsg->msg); |
| 210 | err = krping_doit(krpingmsg->msg); |
| 211 | done: |
| 212 | free(krpingmsg, M_DEVBUF); |
| 213 | return(err); |
| 214 | } |
| 215 | |
| 216 | static void |
| 217 | krping_purge(struct cdev *dev __unused) |
nothing calls this directly
no test coverage detected