Date: Sat, 14 Jul 2007 07:45:28 GMT From: Andrew Turner <andrew@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 123473 for review Message-ID: <200707140745.l6E7jSp2040719@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=123473 Change 123473 by andrew@andrew_hermies on 2007/07/14 07:45:24 Implement the list_updates handler returning fake data for now Affected files ... .. //depot/projects/soc2007/andrew-update/backend/facund-be.c#12 edit Differences ... ==== //depot/projects/soc2007/andrew-update/backend/facund-be.c#12 (text+ko) ==== @@ -285,34 +285,164 @@ return resp; } -static struct facund_response * -facund_call_list_updates(const char *id __unused, struct facund_object *obj __unused) +static const char ** +get_dir_list(const struct facund_object *obj) { + const char **dirs; const struct facund_object *cur; - unsigned int pos; + size_t items, pos; + assert(obj != NULL); - if (obj == NULL) { - /* TODO: Don't use magic numbers */ - return facund_response_new(id, 1, "No data sent", NULL); - } + switch(facund_object_get_type(obj)) { + case FACUND_STRING: + dirs = malloc(2 * sizeof(char *)); + if (dirs == NULL) + return NULL; - switch (facund_object_get_type(obj)) { - case FACUND_STRING: - facund_object_print(obj); + dirs[0] = facund_object_get_string( + __DECONST(struct facund_object *, obj)); + dirs[1] = NULL; break; case FACUND_ARRAY: + items = facund_object_array_size(obj); + if (items == 0) + return NULL; + + dirs = malloc((items + 1) * sizeof(char *)); + if (dirs == NULL) + return NULL; + for (pos = 0; (cur = facund_object_get_array_item(obj, pos)) != NULL; - pos++) { - facund_object_print(__DECONST(struct facund_object *, cur)); + pos++) { + dirs[pos] = facund_object_get_string(cur); } + dirs[pos] = NULL; + assert(pos == items); + break; default: + return NULL; + } + return dirs; +} + +static struct facund_response * +facund_call_list_updates(const char *id, struct facund_object *obj) +{ + const struct facund_object *cur, *area_objs[2]; + struct facund_object *args; + const char **base_dirs, *areas[2]; + int get_base, get_ports; + unsigned int pos; + enum facund_type type; + + get_base = get_ports = 0; + base_dirs = NULL; + + if (obj == NULL) { + /* TODO: Don't use magic numbers */ + return facund_response_new(id, 1, "No data sent", NULL); + } + + if (facund_object_get_type(obj) != FACUND_ARRAY) { return facund_response_new(id, 1, "Bad data sent", NULL); - break; + } + + for (pos = 0; (cur = facund_object_get_array_item(obj, pos)) != NULL; + pos++) { + switch (pos) { + case 0: + /* Read in the type of updates to list */ + type = facund_object_get_type(cur); + if (type == FACUND_ARRAY) { + if (facund_object_array_size(cur) != 2) { + return facund_response_new(id, 1, + "Wrong number of arguments", NULL); + } + area_objs[0] = + facund_object_get_array_item(cur, 0); + area_objs[1] = + facund_object_get_array_item(cur, 1); + + areas[0] = + facund_object_get_string(area_objs[0]); + areas[1] = + facund_object_get_string(area_objs[1]); + + if (strcmp(areas[0], "base") == 0 || + strcmp(areas[1], "base")) + get_base = 1; + + if (strcmp(areas[0], "base") == 0 || + strcmp(areas[1], "base")) + get_ports = 1; + } else if (type == FACUND_STRING) { + areas[0] = facund_object_get_string(cur); + if (strcmp(areas[0], "base") == 0) { + get_base = 1; + } else if (strcmp(areas[0], "base") == 0) { + get_ports = 1; + } + } else { + return facund_response_new(id, 1, + "Incorrect data type", NULL); + } + break; + case 1: + /* Read in the directories to fet updates for */ + base_dirs = get_dir_list(cur); + if (base_dirs == NULL) + return facund_response_new(id, 1, + "Malloc failed", NULL); + break; + default: + if (base_dirs != NULL) + free(base_dirs); + + return facund_response_new(id, 1, "Too many arguments", + NULL); + } + } + if (pos != 2) { + if (base_dirs != NULL) + free(base_dirs); + return facund_response_new(id, 1, + "Not enough arguments", NULL); + } + /* + * If any of these asserts fail there was + * incorrect logic checking arguments + */ + assert(get_ports == 1 || get_base == 1); + assert(base_dirs[0] != NULL); + + args = facund_object_new_array(); + for (pos = 0; base_dirs[pos] != NULL; pos++) { + struct facund_object *pair, *item, *updates; + + pair = facund_object_new_array(); + + /* Add the directory to the start of the array */ + item = facund_object_new_string(); + facund_object_set_string(item, base_dirs[pos]); + facund_object_array_append(pair, item); + + /* Add a list of directories to the array */ + updates = facund_object_new_array(); + item = facund_object_new_string(); + facund_object_set_string(item, "6.2-p1"); + facund_object_array_append(updates, item); + facund_object_array_append(pair, updates); + + /* Add the directory on to the end of the arguments to return */ + facund_object_array_append(args, pair); } - printf("STUB: %s\n", __func__); - return NULL; + + printf("STUB: %s (base: %s, ports: %s)\n", __func__, + (get_base ? "yes" : "no"), (get_ports ? "yes" : "no")); + free(base_dirs); + return facund_response_new(id, RESP_GOOD, "Success", args); } static struct facund_response * @@ -344,7 +474,7 @@ } int -main(int argc __unused, char *argv[] __unused) +main(int argc, char *argv[]) { pthread_t update_thread, comms_thread; struct facund_conn *conn;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707140745.l6E7jSp2040719>