xref: /dflybsd-src/usr.sbin/installer/libdfui/system.c (revision 21c1c48a7e64668a06720f9c83e65819a98cccee)
1*21c1c48aSSascha Wildner /*
2*21c1c48aSSascha Wildner  * system.c
3*21c1c48aSSascha Wildner  * System definitions and capabilities.
4*21c1c48aSSascha Wildner  * $Id: system.c,v 1.5 2004/11/14 02:45:51 cpressey Exp $
5*21c1c48aSSascha Wildner  */
6*21c1c48aSSascha Wildner 
7*21c1c48aSSascha Wildner #include <sys/param.h>
8*21c1c48aSSascha Wildner #include <sys/sysctl.h>
9*21c1c48aSSascha Wildner 
10*21c1c48aSSascha Wildner #include <err.h>
11*21c1c48aSSascha Wildner #include <stdio.h>
12*21c1c48aSSascha Wildner #include <string.h>
13*21c1c48aSSascha Wildner #include <sysexits.h>
14*21c1c48aSSascha Wildner 
15*21c1c48aSSascha Wildner #include "dfui.h"
16*21c1c48aSSascha Wildner #include "system.h"
17*21c1c48aSSascha Wildner 
18*21c1c48aSSascha Wildner char *
19*21c1c48aSSascha Wildner ostype()
20*21c1c48aSSascha Wildner {
21*21c1c48aSSascha Wildner 	int mib[2];
22*21c1c48aSSascha Wildner 	size_t len;
23*21c1c48aSSascha Wildner 	char *p;
24*21c1c48aSSascha Wildner 
25*21c1c48aSSascha Wildner 	mib[0] = CTL_KERN;
26*21c1c48aSSascha Wildner 	mib[1] = KERN_OSTYPE;
27*21c1c48aSSascha Wildner 	sysctl(mib, 2, NULL, &len, NULL, 0);
28*21c1c48aSSascha Wildner 	p = malloc(len);
29*21c1c48aSSascha Wildner 	sysctl(mib, 2, p, &len, NULL, 0);
30*21c1c48aSSascha Wildner 	return p;
31*21c1c48aSSascha Wildner }
32*21c1c48aSSascha Wildner 
33*21c1c48aSSascha Wildner int
34*21c1c48aSSascha Wildner has_caps()
35*21c1c48aSSascha Wildner {
36*21c1c48aSSascha Wildner #ifdef HAS_CAPS
37*21c1c48aSSascha Wildner 	return 1;
38*21c1c48aSSascha Wildner #endif
39*21c1c48aSSascha Wildner 	return 0;
40*21c1c48aSSascha Wildner }
41*21c1c48aSSascha Wildner 
42*21c1c48aSSascha Wildner int
43*21c1c48aSSascha Wildner has_npipe()
44*21c1c48aSSascha Wildner {
45*21c1c48aSSascha Wildner #ifdef HAS_NPIPE
46*21c1c48aSSascha Wildner 	return 1;
47*21c1c48aSSascha Wildner #else
48*21c1c48aSSascha Wildner 	return 0;
49*21c1c48aSSascha Wildner #endif
50*21c1c48aSSascha Wildner }
51*21c1c48aSSascha Wildner 
52*21c1c48aSSascha Wildner int
53*21c1c48aSSascha Wildner has_tcp()
54*21c1c48aSSascha Wildner {
55*21c1c48aSSascha Wildner #ifdef HAS_TCP
56*21c1c48aSSascha Wildner 	return 1;
57*21c1c48aSSascha Wildner #else
58*21c1c48aSSascha Wildner 	return 0;
59*21c1c48aSSascha Wildner #endif
60*21c1c48aSSascha Wildner }
61*21c1c48aSSascha Wildner 
62*21c1c48aSSascha Wildner /*
63*21c1c48aSSascha Wildner  * Get transport from transport name.
64*21c1c48aSSascha Wildner  *
65*21c1c48aSSascha Wildner  * return(0) if transport is not supported.
66*21c1c48aSSascha Wildner  * retirn(-1) if transport unknown.
67*21c1c48aSSascha Wildner  */
68*21c1c48aSSascha Wildner int
69*21c1c48aSSascha Wildner get_transport(const char *transport_name)
70*21c1c48aSSascha Wildner {
71*21c1c48aSSascha Wildner 	if (strcmp(transport_name, "caps") == 0) {
72*21c1c48aSSascha Wildner 		if (has_caps())
73*21c1c48aSSascha Wildner 			return DFUI_TRANSPORT_CAPS;
74*21c1c48aSSascha Wildner 		return(0);
75*21c1c48aSSascha Wildner 	} else if (strcmp(transport_name, "npipe") == 0) {
76*21c1c48aSSascha Wildner 		if (has_npipe())
77*21c1c48aSSascha Wildner 			return DFUI_TRANSPORT_NPIPE;
78*21c1c48aSSascha Wildner 		return(0);
79*21c1c48aSSascha Wildner 	} else if (strcmp(transport_name, "tcp") == 0) {
80*21c1c48aSSascha Wildner 		if (has_tcp())
81*21c1c48aSSascha Wildner 			return DFUI_TRANSPORT_TCP;
82*21c1c48aSSascha Wildner 		return(0);
83*21c1c48aSSascha Wildner 	}
84*21c1c48aSSascha Wildner 	return(-1);
85*21c1c48aSSascha Wildner }
86*21c1c48aSSascha Wildner 
87*21c1c48aSSascha Wildner /*
88*21c1c48aSSascha Wildner  * Get transport upon user request
89*21c1c48aSSascha Wildner  *
90*21c1c48aSSascha Wildner  * Print appropriate error message to stderr
91*21c1c48aSSascha Wildner  * and exit if transport not supported or unknown.
92*21c1c48aSSascha Wildner  */
93*21c1c48aSSascha Wildner int
94*21c1c48aSSascha Wildner user_get_transport(const char *transport_name)
95*21c1c48aSSascha Wildner {
96*21c1c48aSSascha Wildner 	int transport;
97*21c1c48aSSascha Wildner 
98*21c1c48aSSascha Wildner 	transport = get_transport(transport_name);
99*21c1c48aSSascha Wildner 
100*21c1c48aSSascha Wildner 	if (transport == 0) {
101*21c1c48aSSascha Wildner 		errx(EX_UNAVAILABLE, "Transport is not supported: ``%s''.\n",
102*21c1c48aSSascha Wildner 		    transport_name);
103*21c1c48aSSascha Wildner 	} else if (transport < 0) {
104*21c1c48aSSascha Wildner 		errx(EX_CONFIG, "Wrong transport name: ``%s''.\n",
105*21c1c48aSSascha Wildner 		    transport_name);
106*21c1c48aSSascha Wildner 	}
107*21c1c48aSSascha Wildner 
108*21c1c48aSSascha Wildner 	return(transport);
109*21c1c48aSSascha Wildner }
110