x86: Don't enter the monitor for invalid opcode
[akaros.git] / user / iplib / netmkaddr.c
1 /*
2  * This file is part of the UCB release of Plan 9. It is subject to the license
3  * terms in the LICENSE file found in the top-level directory of this
4  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
5  * part of the UCB release of Plan 9, including this file, may be copied,
6  * modified, propagated, or distributed except according to the terms contained
7  * in the LICENSE file.
8  */
9 #include <stdlib.h>
10
11 #include <fcntl.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <sys/types.h>
15 #include <unistd.h>
16
17 /* Makes an address suitable for dialing or announcing.  Takes an address along
18  * with a default network and service to use if they are not specified in the
19  * address.
20  *
21  * Returns a pointer to data in buf[buf_sz] holding the actual address to use.
22  * The caller manages the memory for buf.
23  *
24  * If you pass in only one ! in linear, this assumes this ! was between the net
25  * and the host.  If you pass in no !s, we'll build one from defnet/defsrv. */
26 char *netmkaddr(char *linear, char *defnet, char *defsrv, char *buf,
27                 size_t buf_sz)
28 {
29         char *cp;
30
31         /*
32          *  dump network name
33          */
34         cp = strchr(linear, '!');
35         if (cp == 0) {
36                 if (defnet == 0) {
37                         if (defsrv)
38                                 snprintf(buf, buf_sz, "net!%s!%s", linear, defsrv);
39                         else
40                                 snprintf(buf, buf_sz, "net!%s", linear);
41                 } else {
42                         if (defsrv)
43                                 snprintf(buf, buf_sz, "%s!%s!%s", defnet, linear, defsrv);
44                         else
45                                 snprintf(buf, buf_sz, "%s!%s", defnet, linear);
46                 }
47                 return buf;
48         }
49
50         /*
51          *  if there is already a service, use it
52          */
53         cp = strchr(cp + 1, '!');
54         if (cp)
55                 return linear;
56
57         /*
58          *  add default service
59          */
60         if (defsrv == 0)
61                 return linear;
62         snprintf(buf, buf_sz, "%s!%s", linear, defsrv);
63
64         return buf;
65 }