Example #1
0
static void ds_event(void)
{
	char key[DS_MAX_KEYLEN];
	char *driver_prefix = "drv.net.";
	char *label;
	u32_t value;
	int type;
	endpoint_t owner_endpoint;
	int r;

	/* We may get one notification for multiple updates from DS. Get events
	 * and owners from DS, until DS tells us that there are no more.
	 */
	while ((r = ds_check(key, &type, &owner_endpoint)) == OK) {
		r = ds_retrieve_u32(key, &value);
		if(r != OK) {
			printf("LWIP : ds_event: ds_retrieve_u32 failed\n");
			return;
		}

		/* Only check for network driver up events. */
		if(strncmp(key, driver_prefix, sizeof(driver_prefix))
				|| value != DS_DRIVER_UP)
			return;

		/* The driver label comes after the prefix. */
		label = key + strlen(driver_prefix);

		/* A driver is (re)started. */
		driver_up(label, owner_endpoint);
	}

	if(r != ENOENT)
		printf("LWIP : ds_event: ds_check failed: %d\n", r);
}
Example #2
0
/*===========================================================================*
 *				 ds_event				     *
 *===========================================================================*/
void ds_event()
{
    char key[DS_MAX_KEYLEN];
    char *blkdriver_prefix = "drv.blk.";
    u32_t value;
    int type;
    endpoint_t owner_endpoint;
    int r;
    int which;

    /* Get the event and the owner from DS. */
    r = ds_check(key, &type, &owner_endpoint);
    if(r != OK) {
        if(r != ENOENT)
            printf("Filter: ds_event: ds_check failed: %d\n", r);
        return;
    }
    r = ds_retrieve_u32(key, &value);
    if(r != OK) {
        printf("Filter: ds_event: ds_retrieve_u32 failed\n");
        return;
    }

    /* Only check for VFS driver up events. */
    if(strncmp(key, blkdriver_prefix, strlen(blkdriver_prefix))
            || value != DS_DRIVER_UP) {
        return;
    }

    /* See if this is a driver we are responsible for. */
    if(driver[DRIVER_MAIN].endpt == owner_endpoint) {
        which = DRIVER_MAIN;
    }
    else if(driver[DRIVER_BACKUP].endpt == owner_endpoint) {
        which = DRIVER_BACKUP;
    }
    else {
        return;
    }

    /* Mark the driver as (re)started. */
    driver[which].up_event = driver[which].up_event == UP_EXPECTED ?
                             UP_NONE : UP_PENDING;
}
Example #3
0
/*===========================================================================*
 *				main					     *
 *===========================================================================*/
int main(void)
{
	int r;
	message mess;
	char key[DS_MAX_KEYLEN];
	int type;
	u32_t num;
	char string[17];
	char buf[1000];
	size_t length = 1000;

	/* SEF local startup. */
	sef_local_startup();

	/* Subscribe. */
	r = ds_subscribe(key_u32, DSF_INITIAL);
	if(r != OK && r != EEXIST) {
		printf("SUBSCRIBER: error in ds_subscribe: %d\n", r);
		return -1;
	}

	while(1) {
		/* Wait for a message. */
		r = sef_receive(ANY, &mess);
		if(r != OK) {
			printf("SUBSCRIBER: sef_receive failed.\n");
			return 1;
		}
		/* Only handle notifications from DS. */
		if(mess.m_source != DS_PROC_NR)
			continue;

		/* Check which one was changed. */
		r = ds_check(key, &type, NULL);
		if(r == ENOENT) {
			printf("SUBSCRIBER: the key %s was deleted.\n",
				key);
			continue;
		}
		if(r != OK) {
			printf("SUBSCRIBER: error in ds_check.\n");
			continue;
		}

		/* Retrieve the entry. */
		printf("SUBSCRIBER: key: %s, ", key);
		switch(type) {
		case DSF_TYPE_U32:
			r = ds_retrieve_u32(key, &num);
			if(r != OK)
				printf("error in ds_retrieve_u32.\n");
			printf("U32: %d\n", num);
			break;
		case DSF_TYPE_STR:
			r = ds_retrieve_str(key, string, sizeof(string)-1);
			if(r != OK)
				printf("error in ds_retrieve_str.\n");
			printf("STR: %s\n", string);
			break;
		case DSF_TYPE_MEM:
			r = ds_retrieve_mem(key, buf, &length);
			if(r != OK)
				printf("error in ds_retrieve_mem.\n");
			break;
		case DSF_TYPE_MAP:
			break;
		default:
			printf("error in type! %d\n", type);
		}
	}

	return 0;
}