xref: /dflybsd-src/usr.sbin/installer/libdfui/system.c (revision a9879eb2f9962de6950ccaed0a1156428753ea68)
121c1c48aSSascha Wildner /*
221c1c48aSSascha Wildner  * system.c
321c1c48aSSascha Wildner  * System definitions and capabilities.
421c1c48aSSascha Wildner  * $Id: system.c,v 1.5 2004/11/14 02:45:51 cpressey Exp $
521c1c48aSSascha Wildner  */
621c1c48aSSascha Wildner 
721c1c48aSSascha Wildner #include <sys/param.h>
821c1c48aSSascha Wildner #include <sys/sysctl.h>
921c1c48aSSascha Wildner 
1021c1c48aSSascha Wildner #include <err.h>
1121c1c48aSSascha Wildner #include <stdio.h>
1221c1c48aSSascha Wildner #include <string.h>
1321c1c48aSSascha Wildner #include <sysexits.h>
1421c1c48aSSascha Wildner 
1521c1c48aSSascha Wildner #include "dfui.h"
1621c1c48aSSascha Wildner #include "system.h"
1721c1c48aSSascha Wildner 
1821c1c48aSSascha Wildner char *
19*a9879eb2SSascha Wildner ostype(void)
2021c1c48aSSascha Wildner {
2121c1c48aSSascha Wildner 	int mib[2];
2221c1c48aSSascha Wildner 	size_t len;
2321c1c48aSSascha Wildner 	char *p;
2421c1c48aSSascha Wildner 
2521c1c48aSSascha Wildner 	mib[0] = CTL_KERN;
2621c1c48aSSascha Wildner 	mib[1] = KERN_OSTYPE;
2721c1c48aSSascha Wildner 	sysctl(mib, 2, NULL, &len, NULL, 0);
2821c1c48aSSascha Wildner 	p = malloc(len);
2921c1c48aSSascha Wildner 	sysctl(mib, 2, p, &len, NULL, 0);
3021c1c48aSSascha Wildner 	return p;
3121c1c48aSSascha Wildner }
3221c1c48aSSascha Wildner 
3321c1c48aSSascha Wildner int
34*a9879eb2SSascha Wildner has_caps(void)
3521c1c48aSSascha Wildner {
3621c1c48aSSascha Wildner #ifdef HAS_CAPS
3721c1c48aSSascha Wildner 	return 1;
3821c1c48aSSascha Wildner #endif
3921c1c48aSSascha Wildner 	return 0;
4021c1c48aSSascha Wildner }
4121c1c48aSSascha Wildner 
4221c1c48aSSascha Wildner int
43*a9879eb2SSascha Wildner has_npipe(void)
4421c1c48aSSascha Wildner {
4521c1c48aSSascha Wildner #ifdef HAS_NPIPE
4621c1c48aSSascha Wildner 	return 1;
4721c1c48aSSascha Wildner #else
4821c1c48aSSascha Wildner 	return 0;
4921c1c48aSSascha Wildner #endif
5021c1c48aSSascha Wildner }
5121c1c48aSSascha Wildner 
5221c1c48aSSascha Wildner int
53*a9879eb2SSascha Wildner has_tcp(void)
5421c1c48aSSascha Wildner {
5521c1c48aSSascha Wildner #ifdef HAS_TCP
5621c1c48aSSascha Wildner 	return 1;
5721c1c48aSSascha Wildner #else
5821c1c48aSSascha Wildner 	return 0;
5921c1c48aSSascha Wildner #endif
6021c1c48aSSascha Wildner }
6121c1c48aSSascha Wildner 
6221c1c48aSSascha Wildner /*
6321c1c48aSSascha Wildner  * Get transport from transport name.
6421c1c48aSSascha Wildner  *
6521c1c48aSSascha Wildner  * return(0) if transport is not supported.
6621c1c48aSSascha Wildner  * retirn(-1) if transport unknown.
6721c1c48aSSascha Wildner  */
6821c1c48aSSascha Wildner int
6921c1c48aSSascha Wildner get_transport(const char *transport_name)
7021c1c48aSSascha Wildner {
7121c1c48aSSascha Wildner 	if (strcmp(transport_name, "caps") == 0) {
7221c1c48aSSascha Wildner 		if (has_caps())
7321c1c48aSSascha Wildner 			return DFUI_TRANSPORT_CAPS;
7421c1c48aSSascha Wildner 		return(0);
7521c1c48aSSascha Wildner 	} else if (strcmp(transport_name, "npipe") == 0) {
7621c1c48aSSascha Wildner 		if (has_npipe())
7721c1c48aSSascha Wildner 			return DFUI_TRANSPORT_NPIPE;
7821c1c48aSSascha Wildner 		return(0);
7921c1c48aSSascha Wildner 	} else if (strcmp(transport_name, "tcp") == 0) {
8021c1c48aSSascha Wildner 		if (has_tcp())
8121c1c48aSSascha Wildner 			return DFUI_TRANSPORT_TCP;
8221c1c48aSSascha Wildner 		return(0);
8321c1c48aSSascha Wildner 	}
8421c1c48aSSascha Wildner 	return(-1);
8521c1c48aSSascha Wildner }
8621c1c48aSSascha Wildner 
8721c1c48aSSascha Wildner /*
8821c1c48aSSascha Wildner  * Get transport upon user request
8921c1c48aSSascha Wildner  *
9021c1c48aSSascha Wildner  * Print appropriate error message to stderr
9121c1c48aSSascha Wildner  * and exit if transport not supported or unknown.
9221c1c48aSSascha Wildner  */
9321c1c48aSSascha Wildner int
9421c1c48aSSascha Wildner user_get_transport(const char *transport_name)
9521c1c48aSSascha Wildner {
9621c1c48aSSascha Wildner 	int transport;
9721c1c48aSSascha Wildner 
9821c1c48aSSascha Wildner 	transport = get_transport(transport_name);
9921c1c48aSSascha Wildner 
10021c1c48aSSascha Wildner 	if (transport == 0) {
10121c1c48aSSascha Wildner 		errx(EX_UNAVAILABLE, "Transport is not supported: ``%s''.\n",
10221c1c48aSSascha Wildner 		    transport_name);
10321c1c48aSSascha Wildner 	} else if (transport < 0) {
10421c1c48aSSascha Wildner 		errx(EX_CONFIG, "Wrong transport name: ``%s''.\n",
10521c1c48aSSascha Wildner 		    transport_name);
10621c1c48aSSascha Wildner 	}
10721c1c48aSSascha Wildner 
10821c1c48aSSascha Wildner 	return(transport);
10921c1c48aSSascha Wildner }
110