| // Copyright 2016 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| #include <stdio.h> |
| #include <string.h> |
| #include <regex.h> |
| |
| #include "label_detect.h" |
| |
| bool get_board_name(int board_buffer_len, char *board) { |
| const char *kBoardKey = "CHROMEOS_RELEASE_BOARD="; |
| char line[1024]; |
| bool found = false; |
| FILE *fp = fopen("/etc/lsb-release", "r"); |
| |
| if (!fp) { |
| TRACE("failed to open /etc/lsb-release\n"); |
| return false; |
| } |
| |
| while (fgets(line, sizeof(line), fp)) { |
| if (strlen(line) == sizeof(line) - 1) { |
| TRACE("line too long\n"); |
| break; |
| } |
| |
| if (strncmp(line, kBoardKey, strlen(kBoardKey)) != 0) |
| continue; |
| |
| /* chomp trailing newline character. */ |
| line[strlen(line) - 1] = '\0'; |
| |
| char *p = line + strlen(kBoardKey); |
| if (strlen(p) >= board_buffer_len) { |
| TRACE("board name too long: %s\n", p); |
| break; |
| } |
| strcpy(board, p); |
| found = true; |
| } |
| fclose(fp); |
| |
| if (!found) { |
| TRACE("not found line starts with %s\n", kBoardKey); |
| } |
| return found; |
| } |
| |
| void match_rule(char *board, char *rule_line) { |
| char *pattern, *label; |
| char *comment = strchr(rule_line, '#'); |
| |
| /* ignore comments */ |
| if (comment) |
| *comment = '\0'; |
| |
| pattern = strtok(rule_line, " \t\n"); |
| if (!pattern) |
| return; // blank line |
| |
| regex_t reg; |
| regmatch_t match; |
| |
| regcomp(®, pattern, REG_EXTENDED); |
| if (regexec(®, board, 1, &match, 0) == 0) { |
| TRACE("matched %s\n", pattern); |
| for (label = strtok(NULL, " \t\n"); label; label = strtok(NULL, " \t\n")) { |
| printf("Detected label: %s\n", label); |
| } |
| } |
| regfree(®); |
| } |
| |
| void detect_label_by_board_name() { |
| const char *conf_filename = "/usr/local/etc/avtest_label_detect.conf"; |
| const int kMaxBoardLen = 64; |
| char board[kMaxBoardLen]; |
| char rule_line[1024]; |
| FILE *fp; |
| |
| if (!get_board_name(sizeof(board), board)) |
| return; |
| |
| TRACE("board=%s\n", board); |
| |
| fp = fopen(conf_filename, "r"); |
| if (fp) { |
| while (fgets(rule_line, sizeof(rule_line), fp)) { |
| if (strlen(rule_line) == sizeof(rule_line) - 1) { |
| TRACE("rule line too long, skip\n"); |
| continue; |
| } |
| match_rule(board, rule_line); |
| } |
| fclose(fp); |
| } else { |
| TRACE("Cannot read %s, skip\n", conf_filename); |
| } |
| } |