xref: /inferno-os/os/port/devindir.c (revision 7ef44d652ae9e5e1f5b3465d73684e4a54de73c0)
1 #include	"u.h"
2 #include	"../port/lib.h"
3 #include	"mem.h"
4 #include	"dat.h"
5 #include	"fns.h"
6 #include	"../port/error.h"
7 
8 static Chan *
9 indirattach(char *spec)
10 {
11 	char *p;
12 	Dev *d;
13 
14 	if(*spec == 0)
15 		error(Ebadspec);
16 	p = strrchr(spec, '!');
17 	if(p == nil)
18 		p = "";
19 	else
20 		*p++ = 0;
21 	d = devbyname(spec);
22 	if(d == nil || d->dc == '*'){
23 		snprint(up->env->errstr, ERRMAX, "unknown device: %s", spec);
24 		error(up->env->errstr);
25 	}
26 	if(up->env->pgrp->nodevs &&
27 	   (utfrune("|esDa", d->dc) == nil || d->dc == 's' && *p!='\0'))
28 		error(Enoattach);
29 	return d->attach(p);
30 }
31 
32 Dev indirdevtab = {
33 	'*',
34 	"indir",
35 
36 	devreset,
37 	devinit,
38 	devshutdown,
39 	indirattach,
40 };
41