Changeset 278ac72 in mainline for uspace/srv


Ignore:
Timestamp:
2011-08-16T15:35:56Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
30c78c0
Parents:
16dc887
Message:

Add API for getting list of categories.

Location:
uspace/srv/loc
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/loc/category.c

    r16dc887 r278ac72  
    5454        list_append(&cat->cat_list, &cdir->categories);
    5555}
     56
     57/** Get list of categories. */
     58int categ_dir_get_categories(categ_dir_t *cdir, category_id_t *id_buf,
     59    size_t buf_size, size_t *act_size)
     60{
     61        size_t act_cnt;
     62        size_t buf_cnt;
     63
     64        assert(fibril_mutex_is_locked(&cdir->mutex));
     65
     66        buf_cnt = buf_size / sizeof(category_id_t);
     67
     68        act_cnt = list_count(&cdir->categories);
     69        *act_size = act_cnt * sizeof(category_id_t);
     70
     71        if (buf_size % sizeof(category_id_t) != 0)
     72                return EINVAL;
     73
     74        size_t pos = 0;
     75        list_foreach(cdir->categories, item) {
     76                category_t *cat =
     77                    list_get_instance(item, category_t, cat_list);
     78
     79                if (pos < buf_cnt)
     80                        id_buf[pos] = cat->id;
     81                pos++;
     82        }
     83
     84        return EOK;
     85}
     86
    5687
    5788/** Initialize category structure. */
  • uspace/srv/loc/category.h

    r16dc887 r278ac72  
    6969extern void categ_dir_init(categ_dir_t *);
    7070extern void categ_dir_add_cat(categ_dir_t *, category_t *);
     71extern int categ_dir_get_categories(categ_dir_t *, service_id_t *, size_t,
     72    size_t *);
    7173extern category_t *category_new(const char *);
    7274extern int category_add_service(category_t *, loc_service_t *);
  • uspace/srv/loc/loc.c

    r16dc887 r278ac72  
    755755}
    756756
     757static void loc_get_categories(ipc_callid_t iid, ipc_call_t *icall)
     758{
     759        ipc_callid_t callid;
     760        size_t size;
     761        size_t act_size;
     762        int rc;
     763       
     764        if (!async_data_read_receive(&callid, &size)) {
     765                async_answer_0(callid, EREFUSED);
     766                async_answer_0(iid, EREFUSED);
     767                return;
     768        }
     769       
     770        category_id_t *id_buf = (category_id_t *) malloc(size);
     771        if (id_buf == NULL) {
     772                fibril_mutex_unlock(&cdir.mutex);
     773                async_answer_0(callid, ENOMEM);
     774                async_answer_0(iid, ENOMEM);
     775                return;
     776        }
     777       
     778        fibril_mutex_lock(&cdir.mutex);
     779       
     780        rc = categ_dir_get_categories(&cdir, id_buf, size, &act_size);
     781        if (rc != EOK) {
     782                fibril_mutex_unlock(&cdir.mutex);
     783                async_answer_0(callid, rc);
     784                async_answer_0(iid, rc);
     785                return;
     786        }
     787       
     788        fibril_mutex_unlock(&cdir.mutex);
     789       
     790        sysarg_t retval = async_data_read_finalize(callid, id_buf, size);
     791        free(id_buf);
     792       
     793        async_answer_1(iid, retval, act_size);
     794}
     795
    757796static void loc_get_namespaces(ipc_callid_t iid, ipc_call_t *icall)
    758797{
     
    11811220                case LOC_GET_SERVICE_COUNT:
    11821221                        loc_get_service_count(callid, &call);
     1222                        break;
     1223                case LOC_GET_CATEGORIES:
     1224                        loc_get_categories(callid, &call);
    11831225                        break;
    11841226                case LOC_GET_NAMESPACES:
Note: See TracChangeset for help on using the changeset viewer.