PERFORCE change 123837 for review
Andrew Turner
andrew at FreeBSD.org
Sat Jul 21 10:52:33 UTC 2007
http://perforce.freebsd.org/chv.cgi?CH=123837
Change 123837 by andrew at 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 *
More information about the p4-projects
mailing list