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); }
/*===========================================================================* * 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; }
/*===========================================================================* * 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; }