Date: Sun, 29 Jul 2007 11:50:19 GMT From: Andrew Turner <andrew@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 124309 for review Message-ID: <200707291150.l6TBoJlC000814@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=124309 Change 124309 by andrew@andrew_hermies on 2007/07/29 11:49:45 Decode lines from the tag file. These contain information about patch levels avaliable to us Affected files ... .. //depot/projects/soc2007/andrew-update/backend/facund-be.c#19 edit Differences ... ==== //depot/projects/soc2007/andrew-update/backend/facund-be.c#19 (text+ko) ==== @@ -58,6 +58,8 @@ #define DEFAULT_CONFIG_FILE "/etc/freebsd-update-control.conf" #define UPDATE_DATA_DIR "/var/db/freebsd-update" +static struct fbsd_tag_line *facund_tag_decode_line(const char *); +static void facund_tag_free(struct fbsd_tag_line *); static int facund_has_update(unsigned int); static void *look_for_updates(void *); static int facund_read_base_dirs(const char *); @@ -93,19 +95,128 @@ char *db_base; char *db_dir; int db_fd; + + char *db_tag_file; }; static unsigned int watched_db_count = 0; static struct fbsd_update_db *watched_db = NULL; +struct fbsd_tag_line { + char *tag_platform; + char *tag_release; + char *tag_patch; + char tag_tindexhash[65]; + char tag_eol[11]; +}; + /* + * Decodes the data in a line from the tag file + */ +static struct fbsd_tag_line * +facund_tag_decode_line(const char *buf) +{ + struct fbsd_tag_line *line; + unsigned int len, item; + const char *str, *ptr; + + if (buf == NULL) + return NULL; + + line = calloc(sizeof(struct fbsd_tag_line), 1); + if (line == NULL) + return NULL; + + str = buf; + ptr = NULL; + + for (item = 0, ptr = strchr(str, '|'); ptr != NULL; + ptr = strchr(str, '|')) { + len = ptr - str; + + switch (item) { + case 0: + if (strncmp("freebsd-update", str, len) != 0) + goto facund_decode_tag_line_exit; + break; + case 1: + line->tag_platform = malloc(len + 1); + if (line->tag_platform == NULL) + goto facund_decode_tag_line_exit; + + strlcpy(line->tag_platform, str, len + 1); + break; + case 2: + line->tag_release = malloc(len + 1); + if (line->tag_release == NULL) + goto facund_decode_tag_line_exit; + + strlcpy(line->tag_release, str, len + 1); + break; + case 3: + line->tag_patch = malloc(len + 1); + if (line->tag_patch == NULL) + goto facund_decode_tag_line_exit; + + strlcpy(line->tag_patch, str, len + 1); + break; + case 4: + if (len != 64) + goto facund_decode_tag_line_exit; + + strlcpy(line->tag_tindexhash, str, 65); + break; + } + + str = ptr + 1; + item++; + } + if (item != 5) { + goto facund_decode_tag_line_exit; + } else { + if (strlen(str) != 11) + goto facund_decode_tag_line_exit; + + strlcpy(line->tag_eol, str, 11); + } + + return line; + +facund_decode_tag_line_exit: + /* Clean up on failure */ + facund_tag_free(line); + + return NULL; +} + +static void +facund_tag_free(struct fbsd_tag_line *line) +{ + if (line == NULL) + return; + + if (line->tag_platform != NULL) + free(line->tag_platform); + + if (line->tag_release != NULL) + free(line->tag_release); + + if (line->tag_patch != NULL) + free(line->tag_patch); + + free(line); +} + +/* * Looks for updates on the system with a root of basedir */ static int facund_has_update(unsigned int pos) { struct stat sb; - char install_link[PATH_MAX], sha_base[PATH_MAX], sum[65]; + FILE *tag_fd; + char install_link[PATH_MAX], sha_base[PATH_MAX], sum[65], buf[1024]; + struct fbsd_tag_line *line; assert(pos < watched_db_count); snprintf(sha_base, PATH_MAX, "%s\n", watched_db[pos].db_base); @@ -115,8 +226,17 @@ /* Look for the install link and check if it is a symlink */ if (lstat(install_link, &sb) == 0) { - if (S_ISLNK(sb.st_mode)) + if (S_ISLNK(sb.st_mode)) { + tag_fd = fopen(watched_db[pos].db_tag_file, "r"); + while (fgets(buf, sizeof buf, tag_fd) != NULL) { + line = facund_tag_decode_line(buf); + if (line != NULL) { + facund_tag_free(line); + } + } + fclose(tag_fd); return 1; + } } return 0; } @@ -324,7 +444,18 @@ strlcpy(watched_db[pos].db_base, ptr, len); asprintf(&watched_db[pos].db_dir, "%s" UPDATE_DATA_DIR, watched_db[pos].db_base); - printf("%s\n", watched_db[pos].db_dir); + if (watched_db[pos].db_dir == NULL) { + free(watched_db[pos].db_base); + return -1; + } + + asprintf(&watched_db[pos].db_tag_file, "%s/tag", + watched_db[pos].db_dir); + if (watched_db[pos].db_dir == NULL) { + free(watched_db[pos].db_base); + free(watched_db[pos].db_dir); + return -1; + } ptr = next_ptr; if (ptr[0] == '\0') {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707291150.l6TBoJlC000814>