Пример #1
0
int
main(int argc, char **argv)
{
    char *logical_name, *ptr;
    char sstring[256];
    struct CuDv cudvobj;
    struct PdDv pddvobj;
    int rc, how_many, errflg, c, majorno, minorno, unit, verbose;
    struct cfg_dd cfg;
    struct cfg_load load;
    int *minor_list;
    extern int optind;
    extern char *optarg;

    verbose = errflg = 0;
    logical_name = NULL;
    while ((c = getopt(argc,argv,"vl:")) != EOF) {
	switch (c) {
	case 'v':
	    verbose++;
	    break;
	case 'l':
	    if (logical_name != NULL)
		errflg++;
	    logical_name = optarg;
	    break;
	default:
	    errflg++;
	}
    }
    if (errflg)
	exit(E_ARGS);

    if (logical_name == NULL)
	exit(E_LNAME);

    if (odm_initialize() == -1)
	exit(E_ODMINIT);

    /* Get Customized Device Object for this device */
    sprintf(sstring,"name = '%s'",logical_name);
    rc = (int) odm_get_first(CuDv_CLASS, sstring, &cudvobj);
    if (rc ==  0) {
	err_exit(E_NOCuDv);
    } else if (rc == -1) {
	err_exit(E_ODMGET);
    }

    if (cudvobj.status == DEFINED)
	err_exit(E_OK);  /* already unconf'd */

    /* get device's predefined object */
    sprintf(sstring,"uniquetype = '%s'", cudvobj.PdDvLn_Lvalue);
    rc = (int) odm_get_first(PdDv_CLASS, sstring, &pddvobj);
    if (rc ==  0)
	err_exit(E_NOPdDv);
    else if (rc == -1)
	err_exit(E_ODMGET);

    /*
     * Call sysconfig() to "terminate" the device.
     * If fails with EBUSY, then device instance is "open",
     * and device cannot be "unconfigured".  Any other errno
     * returned will be ignored since we MUST unconfigure the
     * device even if it reports some other error.
     */

    /* get major number of device */
    majorno = genmajor(pddvobj.DvDr);
    if (majorno == -1) {
	return(E_MAJORNO);
    }
    /* get minor number */
    minor_list = getminor(majorno, &how_many, pddvobj.DvDr);
    if (minor_list == NULL || how_many == 0)
	err_exit (E_MINORNO);
    vprintf("how_many=%d\n", how_many);
    ptr = logical_name;
    ptr += strlen(pddvobj.prefix);
    unit = atoi(ptr);
    if (unit >= how_many) {
	err_exit (E_MINORNO);
    }
    minorno = minor_list[unit];
    vprintf("unit %d minorno %d\n", unit, minorno);

    /* create devno for this device */
    cfg.devno = makedev(majorno, minorno);
    cfg.kmid = 0;
    cfg.ddsptr = (caddr_t) NULL;
    cfg.ddslen = (int) 0;
    cfg.cmd = CFG_TERM;
    if (sysconfig(SYS_CFGDD, &cfg, sizeof(struct cfg_dd)) == -1) {
	if (errno == EBUSY)
	    err_exit(E_BUSY);
    }
    cfg.kmid = loadext(pddvobj.DvDr, FALSE, FALSE);
    if (cfg.kmid == NULL)
	err_exit(E_UNLOADEXT);

    /* Change the status field of device to "DEFINED" */
    cudvobj.status = DEFINED;
    if (odm_change_obj(CuDv_CLASS, &cudvobj) == -1) 
	err_exit(E_ODMUPDATE);

    /*
     * Terminate ODM
     */
    odm_terminate();
    return (E_OK);
}
Пример #2
0
static int
bpf_load(char *errbuf)
{
	long major;
	int *minors;
	int numminors, i, rc;
	char buf[1024];
	struct stat sbuf;
	struct bpf_config cfg_bpf;
	struct cfg_load cfg_ld;
	struct cfg_kmod cfg_km;

	/*
	 * This is very very close to what happens in the real implementation
	 * but I've fixed some (unlikely) bug situations.
	 */
	if (bpfloadedflag)
		return (0);

	if (bpf_odminit(errbuf) != 0)
		return (-1);

	major = genmajor(BPF_NAME);
	if (major == -1) {
		snprintf(errbuf, PCAP_ERRBUF_SIZE,
		    "bpf_load: genmajor failed: %s", pcap_strerror(errno));
		return (-1);
	}

	minors = getminor(major, &numminors, BPF_NAME);
	if (!minors) {
		minors = genminor("bpf", major, 0, BPF_MINORS, 1, 1);
		if (!minors) {
			snprintf(errbuf, PCAP_ERRBUF_SIZE,
			    "bpf_load: genminor failed: %s",
			    pcap_strerror(errno));
			return (-1);
		}
	}

	if (bpf_odmcleanup(errbuf))
		return (-1);

	rc = stat(BPF_NODE "0", &sbuf);
	if (rc == -1 && errno != ENOENT) {
		snprintf(errbuf, PCAP_ERRBUF_SIZE,
		    "bpf_load: can't stat %s: %s",
		    BPF_NODE "0", pcap_strerror(errno));
		return (-1);
	}

	if (rc == -1 || getmajor(sbuf.st_rdev) != major) {
		for (i = 0; i < BPF_MINORS; i++) {
			sprintf(buf, "%s%d", BPF_NODE, i);
			unlink(buf);
			if (mknod(buf, S_IRUSR | S_IFCHR, domakedev(major, i)) == -1) {
				snprintf(errbuf, PCAP_ERRBUF_SIZE,
				    "bpf_load: can't mknod %s: %s",
				    buf, pcap_strerror(errno));
				return (-1);
			}
		}
	}

	/* Check if the driver is loaded */
	memset(&cfg_ld, 0x0, sizeof(cfg_ld));
	cfg_ld.path = buf;
	sprintf(cfg_ld.path, "%s/%s", DRIVER_PATH, BPF_NAME);
	if ((sysconfig(SYS_QUERYLOAD, (void *)&cfg_ld, sizeof(cfg_ld)) == -1) ||
	    (cfg_ld.kmid == 0)) {
		/* Driver isn't loaded, load it now */
		if (sysconfig(SYS_SINGLELOAD, (void *)&cfg_ld, sizeof(cfg_ld)) == -1) {
			snprintf(errbuf, PCAP_ERRBUF_SIZE,
			    "bpf_load: could not load driver: %s",
			    strerror(errno));
			return (-1);
		}
	}

	/* Configure the driver */
	cfg_km.cmd = CFG_INIT;
	cfg_km.kmid = cfg_ld.kmid;
	cfg_km.mdilen = sizeof(cfg_bpf);
	cfg_km.mdiptr = (void *)&cfg_bpf; 
	for (i = 0; i < BPF_MINORS; i++) {
		cfg_bpf.devno = domakedev(major, i);
		if (sysconfig(SYS_CFGKMOD, (void *)&cfg_km, sizeof(cfg_km)) == -1) {
			snprintf(errbuf, PCAP_ERRBUF_SIZE,
			    "bpf_load: could not configure driver: %s",
			    strerror(errno));
			return (-1);
		}
	}
	
	bpfloadedflag = 1;

	return (0);
}