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