streams.c (65314) | streams.c (71448) |
---|---|
1/* 2 * Copyright (c) 1998 Mark Newton 3 * Copyright (c) 1994 Christos Zoulas 4 * Copyright (c) 1997 Todd Vierling 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 16 unchanged lines hidden (view full) --- 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Stolen from NetBSD /sys/compat/svr4/svr4_net.c. Pseudo-device driver 30 * skeleton produced from /usr/share/examples/drivers/make_pseudo_driver.sh 31 * in 3.0-980524-SNAP then hacked a bit (but probably not enough :-). 32 * | 1/* 2 * Copyright (c) 1998 Mark Newton 3 * Copyright (c) 1994 Christos Zoulas 4 * Copyright (c) 1997 Todd Vierling 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions --- 16 unchanged lines hidden (view full) --- 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Stolen from NetBSD /sys/compat/svr4/svr4_net.c. Pseudo-device driver 30 * skeleton produced from /usr/share/examples/drivers/make_pseudo_driver.sh 31 * in 3.0-980524-SNAP then hacked a bit (but probably not enough :-). 32 * |
33 * $FreeBSD: head/sys/dev/streams/streams.c 65314 2000-09-01 08:47:14Z obrien $ | 33 * $FreeBSD: head/sys/dev/streams/streams.c 71448 2001-01-23 21:06:30Z jhb $ |
34 */ 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/kernel.h> /* SYSINIT stuff */ 39#include <sys/conf.h> /* cdevsw stuff */ 40#include <sys/malloc.h> /* malloc region definitions */ 41#include <sys/file.h> --- 160 unchanged lines hidden (view full) --- 202{ 203 int type, protocol; 204 int fd; 205 struct file *fp; 206 struct socket *so; 207 int error; 208 int family; 209 | 34 */ 35 36#include <sys/param.h> 37#include <sys/systm.h> 38#include <sys/kernel.h> /* SYSINIT stuff */ 39#include <sys/conf.h> /* cdevsw stuff */ 40#include <sys/malloc.h> /* malloc region definitions */ 41#include <sys/file.h> --- 160 unchanged lines hidden (view full) --- 202{ 203 int type, protocol; 204 int fd; 205 struct file *fp; 206 struct socket *so; 207 int error; 208 int family; 209 |
210 if (p->p_dupfd >= 0) | 210 PROC_LOCK(p); 211 if (p->p_dupfd >= 0) { 212 PROC_UNLOCK(p); |
211 return ENODEV; | 213 return ENODEV; |
214 } 215 PROC_UNLOCK(p); |
|
212 213 switch (minor(dev)) { 214 case dev_udp: 215 family = AF_INET; 216 type = SOCK_DGRAM; 217 protocol = IPPROTO_UDP; 218 break; 219 --- 46 unchanged lines hidden (view full) --- 266 } 267 268 fp->f_data = (caddr_t)so; 269 fp->f_flag = FREAD|FWRITE; 270 fp->f_ops = &svr4_netops; 271 fp->f_type = DTYPE_SOCKET; 272 273 (void)svr4_stream_get(fp); | 216 217 switch (minor(dev)) { 218 case dev_udp: 219 family = AF_INET; 220 type = SOCK_DGRAM; 221 protocol = IPPROTO_UDP; 222 break; 223 --- 46 unchanged lines hidden (view full) --- 270 } 271 272 fp->f_data = (caddr_t)so; 273 fp->f_flag = FREAD|FWRITE; 274 fp->f_ops = &svr4_netops; 275 fp->f_type = DTYPE_SOCKET; 276 277 (void)svr4_stream_get(fp); |
278 PROC_LOCK(p); |
|
274 p->p_dupfd = fd; | 279 p->p_dupfd = fd; |
280 PROC_UNLOCK(p); |
|
275 return ENXIO; 276} 277 278static int 279svr4_ptm_alloc(p) 280 struct proc *p; 281{ 282 /* --- 30 unchanged lines hidden (view full) --- 313 if ((error = copyout(ptyname, path, sizeof(ptyname))) != 0) 314 return error; 315 316 switch (error = open(p, &oa)) { 317 case ENOENT: 318 case ENXIO: 319 return error; 320 case 0: | 281 return ENXIO; 282} 283 284static int 285svr4_ptm_alloc(p) 286 struct proc *p; 287{ 288 /* --- 30 unchanged lines hidden (view full) --- 319 if ((error = copyout(ptyname, path, sizeof(ptyname))) != 0) 320 return error; 321 322 switch (error = open(p, &oa)) { 323 case ENOENT: 324 case ENXIO: 325 return error; 326 case 0: |
327 PROC_LOCK(p); |
|
321 p->p_dupfd = p->p_retval[0]; | 328 p->p_dupfd = p->p_retval[0]; |
329 PROC_UNLOCK(p); |
|
322 return ENXIO; 323 default: 324 if (ttynumbers[++n] == '\0') { 325 if (ttyletters[++l] == '\0') 326 break; 327 n = 0; 328 } 329 } --- 32 unchanged lines hidden (view full) --- 362void 363svr4_delete_socket(p, fp) 364 struct proc *p; 365 struct file *fp; 366{ 367 struct svr4_sockcache_entry *e; 368 void *cookie = ((struct socket *) fp->f_data)->so_emuldata; 369 | 330 return ENXIO; 331 default: 332 if (ttynumbers[++n] == '\0') { 333 if (ttyletters[++l] == '\0') 334 break; 335 n = 0; 336 } 337 } --- 32 unchanged lines hidden (view full) --- 370void 371svr4_delete_socket(p, fp) 372 struct proc *p; 373 struct file *fp; 374{ 375 struct svr4_sockcache_entry *e; 376 void *cookie = ((struct socket *) fp->f_data)->so_emuldata; 377 |
370 if (!svr4_str_initialized) { 371 TAILQ_INIT(&svr4_head); 372 svr4_str_initialized = 1; | 378 while (svr4_str_initialized != 2) { 379 if (atomic_cmpset_acq_int(&svr4_str_initialized, 0, 1)) { 380 TAILQ_INIT(&svr4_head); 381 atomic_store_rel_int(&svr4_str_initialized, 2); 382 } |
373 return; 374 } 375 | 383 return; 384 } 385 |
376 for (e = svr4_head.tqh_first; e != NULL; e = e->entries.tqe_next) | 386 TAILQ_FOREACH(e, &svr4_head, entries) |
377 if (e->p == p && e->cookie == cookie) { 378 TAILQ_REMOVE(&svr4_head, e, entries); 379 DPRINTF(("svr4_delete_socket: %s [%p,%d,%d]\n", 380 e->sock.sun_path, p, e->dev, e->ino)); 381 free(e, M_TEMP); 382 return; 383 } 384} --- 13 unchanged lines hidden --- | 387 if (e->p == p && e->cookie == cookie) { 388 TAILQ_REMOVE(&svr4_head, e, entries); 389 DPRINTF(("svr4_delete_socket: %s [%p,%d,%d]\n", 390 e->sock.sun_path, p, e->dev, e->ino)); 391 free(e, M_TEMP); 392 return; 393 } 394} --- 13 unchanged lines hidden --- |