/*===========================================================================* * test_label * *===========================================================================*/ void test_label(void) { int r; char get_label[DS_MAX_KEYLEN]; unsigned long num; /* Publish and retrieve. */ r = ds_publish_label(key_label, 1234, 0); assert(r == OK); r = ds_retrieve_label_num(key_label, &num); assert(r == OK && num == 1234); /* Here are the differences w.r.t. U32. */ r = ds_publish_label("hello", 1234, 0); assert(r == EEXIST); r = ds_retrieve_label_name(get_label, 1234); assert(r == OK && strcmp(key_label, get_label) == 0); r = ds_delete_label(key_label); assert(r == OK); printf("DSTEST: LABEL test successful!\n"); }
/*===========================================================================* * do_mapdriver * *===========================================================================*/ PUBLIC int do_mapdriver() { int r, force, major, proc_nr_n; unsigned long tasknr; vir_bytes label_vir; size_t label_len; char label[LABEL_MAX]; if (!super_user) { printf("FS: unauthorized call of do_mapdriver by proc %d\n", who_e); return(EPERM); /* only su (should be only RS or some drivers) * may call do_mapdriver. */ } /* Get the label */ label_vir= (vir_bytes)m_in.md_label; label_len= m_in.md_label_len; if (label_len+1 > sizeof(label)) { printf("vfs:do_mapdriver: label too long\n"); return EINVAL; } r= sys_vircopy(who_e, D, label_vir, SELF, D, (vir_bytes)label, label_len); if (r != OK) { printf("vfs:do_mapdriver: sys_vircopy failed: %d\n", r); return EINVAL; } label[label_len]= '\0'; r= ds_retrieve_label_num(label, &tasknr); if (r != OK) { printf("vfs:do_mapdriver: ds doesn't know '%s'\n", label); return EINVAL; } if (isokendpt(tasknr, &proc_nr_n) != OK) { printf("vfs:do_mapdriver: bad endpoint %d\n", tasknr); return(EINVAL); } /* Try to update device mapping. */ major= m_in.md_major; force= m_in.md_force; r= map_driver(label, major, tasknr, m_in.md_style, force); if (r == OK) { /* If a driver has completed its exec(), it can be announced * to be up. */ if(force || fproc[proc_nr_n].fp_execced) { dev_up(major); } else { dmap[major].dmap_flags |= DMAP_BABY; } } return(r); }