From owner-p4-projects@FreeBSD.ORG Sat Jul 21 10:52:32 2007 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id B34A016A41B; Sat, 21 Jul 2007 10:52:32 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 7E3A316A41A for ; Sat, 21 Jul 2007 10:52:32 +0000 (UTC) (envelope-from andrew@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 6E34D13C46C for ; Sat, 21 Jul 2007 10:52:32 +0000 (UTC) (envelope-from andrew@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id l6LAqW2r052490 for ; Sat, 21 Jul 2007 10:52:32 GMT (envelope-from andrew@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id l6LAqV4H052487 for perforce@freebsd.org; Sat, 21 Jul 2007 10:52:31 GMT (envelope-from andrew@freebsd.org) Date: Sat, 21 Jul 2007 10:52:31 GMT Message-Id: <200707211052.l6LAqV4H052487@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to andrew@freebsd.org using -f From: Andrew Turner To: Perforce Change Reviews Cc: Subject: PERFORCE change 123837 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Jul 2007 10:52:33 -0000 http://perforce.freebsd.org/chv.cgi?CH=123837 Change 123837 by andrew@andrew_hermies on 2007/07/21 10:52:07 Move the argument decoding for list_updates and list_installed to seperate functions Return dummy data for list_installed In look_for_updates free dir_fd when exiting Affected files ... .. //depot/projects/soc2007/andrew-update/backend/facund-be.c#16 edit Differences ... ==== //depot/projects/soc2007/andrew-update/backend/facund-be.c#16 (text+ko) ==== @@ -63,6 +63,12 @@ static char **get_base_dirs(char *); static void *do_communication(void *); +static struct facund_response * facund_get_update_types(const char *, + const struct facund_object *, int *, int *); +static const char **facund_get_dir_list(const struct facund_object *); +static struct facund_response *facund_read_type_directory(const char *, + const struct facund_object *, const char ***, int *, int *); + static struct facund_response *facund_call_ping(const char *, struct facund_object *); static struct facund_response *facund_call_list_updates(const char *, @@ -248,6 +254,8 @@ sleep(default_check_period); } } + + free(dir_fd); return NULL; } @@ -361,8 +369,58 @@ return resp; } +/* + * Takes either a facund array or a facund string and sets base + * or ports to true if they are contained in the object + */ +static struct facund_response * +facund_get_update_types(const char *id, const struct facund_object *obj, + int *base, int *ports) +{ + const struct facund_object *area_objs[2]; + const char *areas[2]; + enum facund_type type; + + assert(base != NULL); + assert(ports != NULL); + + type = facund_object_get_type(obj); + if (type == FACUND_ARRAY) { + if (facund_object_array_size(obj) != 2) { + return facund_response_new(id, 1, + "Wrong number of arguments", NULL); + } + area_objs[0] = facund_object_get_array_item(obj, 0); + area_objs[1] = facund_object_get_array_item(obj, 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")) + *base = 1; + + if (strcmp(areas[0], "ports") == 0 || strcmp(areas[1], "ports")) + *ports = 1; + + } else if (type == FACUND_STRING) { + areas[0] = facund_object_get_string(obj); + if (strcmp(areas[0], "base") == 0) { + *base = 1; + } else if (strcmp(areas[0], "ports") == 0) { + *ports = 1; + } + } else { + return facund_response_new(id, 1, "Incorrect data type", NULL); + } + return NULL; +} + +/* + * Takes a either facund array of string objects or a single string + * object and returns a C array of C strings of the objects + */ static const char ** -get_dir_list(const struct facund_object *obj) +facund_get_dir_list(const struct facund_object *obj) { const char **dirs; const struct facund_object *cur; @@ -404,22 +462,18 @@ } static struct facund_response * -facund_call_list_updates(const char *id, struct facund_object *obj) +facund_read_type_directory(const char *id, const struct facund_object *obj, + const char ***base_dirs, int *base, int *ports) { - const struct facund_object *cur, *area_objs[2]; - struct facund_object *args; - const char **base_dirs, *areas[2]; - int get_base, get_ports; + const struct facund_object *cur; + struct facund_response *ret; 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); - } + assert(id != NULL); + assert(obj != NULL); + assert(base_dirs != NULL); + assert(base != NULL); + assert(ports != NULL); if (facund_object_get_type(obj) != FACUND_ARRAY) { return facund_response_new(id, 1, "Bad data sent", NULL); @@ -430,51 +484,20 @@ 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); - } + ret = facund_get_update_types(id, cur, base, ports); + if (ret != NULL) + return ret; break; case 1: - /* Read in the directories to fet updates for */ - base_dirs = get_dir_list(cur); - if (base_dirs == NULL) + /* Read in the directories to get updates for */ + *base_dirs = facund_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); + if (*base_dirs != NULL) + free(*base_dirs); return facund_response_new(id, 1, "Too many arguments", NULL); @@ -486,6 +509,37 @@ return facund_response_new(id, 1, "Not enough arguments", NULL); } + return NULL; +} + +static struct facund_response * +facund_call_list_updates(const char *id, struct facund_object *obj) +{ + struct facund_response *ret; + struct facund_object *args; + const char **base_dirs; + int get_base, get_ports; + unsigned int pos; + + 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); + } + + /* Read in the arguments */ + ret = facund_read_type_directory(id, obj, &base_dirs, &get_base, + &get_ports); + if (ret != NULL) { + if (base_dirs != NULL) + free(base_dirs); + return ret; + } + /* This should have been assigned as ret is NULL when successful */ + assert(base_dirs != NULL); + /* * If any of these asserts fail there was * incorrect logic checking arguments @@ -507,7 +561,7 @@ /* 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_set_string(item, "6.2-p2"); facund_object_array_append(updates, item); facund_object_array_append(pair, updates); @@ -517,15 +571,77 @@ printf("STUB: %s (base: %s, ports: %s)\n", __func__, (get_base ? "yes" : "no"), (get_ports ? "yes" : "no")); + for (pos = 0; base_dirs[pos] != NULL; pos++) { + printf("Dir: %s\n", base_dirs[pos]); + } free(base_dirs); return facund_response_new(id, RESP_GOOD, "Success", args); } static struct facund_response * -facund_call_list_installed(const char *id __unused, struct facund_object *obj __unused) +facund_call_list_installed(const char *id, struct facund_object *obj) { - printf("STUB: %s\n", __func__); - return NULL; + struct facund_response *ret; + struct facund_object *args; + const char **base_dirs; + int get_base, get_ports; + unsigned int pos; + + 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); + } + + /* Read in the arguments */ + ret = facund_read_type_directory(id, obj, &base_dirs, &get_base, + &get_ports); + if (ret != NULL) { + if (base_dirs != NULL) + free(base_dirs); + return ret; + } + /* This should have been assigned as ret is NULL when successful */ + assert(base_dirs != 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 (base: %s, ports: %s)\n", __func__, + (get_base ? "yes" : "no"), (get_ports ? "yes" : "no")); + for (pos = 0; base_dirs[pos] != NULL; pos++) { + printf("Dir: %s\n", base_dirs[pos]); + } + free(base_dirs); + return facund_response_new(id, RESP_GOOD, "Success", args); } static struct facund_response *