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