Skip to content

Commit fffe7e1

Browse files
committed
chore(cmd/bpf-fileids): leverage cgo instead of manually parsing c header.
Signed-off-by: Federico Di Pierro <[email protected]>
1 parent 035cd66 commit fffe7e1

File tree

2 files changed

+44
-35
lines changed

2 files changed

+44
-35
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ clean: cli-clean tarball-clean
105105
##@ Build and install
106106

107107
pkg/errmetrics/fileids.json: bpf/tetragon/fileids.h
108-
go run ./cmd/bpf-fileids bpf/tetragon/fileids.h pkg/errmetrics/fileids.json
108+
go run ./cmd/bpf-fileids pkg/errmetrics/fileids.json
109109

110110
.PHONY: fileids
111111
fileids: pkg/errmetrics/fileids.json

cmd/bpf-fileids/fileids.go

Lines changed: 43 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,38 @@
33

44
package main
55

6+
/*
7+
typedef struct {
8+
const char *filename;
9+
int id;
10+
} fileid_t;
11+
12+
const fileid_t *get_fileids() {
13+
static fileid_t fileids[] = {
14+
#define fileid__(f, id) { f, id },
15+
#include "../../bpf/tetragon/fileids.h"
16+
#undef fileid__
17+
{ NULL, -1 }
18+
};
19+
return fileids;
20+
}
21+
22+
size_t get_fileids_len() {
23+
const fileid_t *fileids = get_fileids();
24+
size_t len = 0;
25+
while (fileids[len].filename != NULL) {
26+
len++;
27+
}
28+
return len;
29+
}
30+
*/
31+
import "C"
32+
633
import (
7-
"bufio"
834
"encoding/json"
935
"fmt"
1036
"os"
11-
"regexp"
12-
"strconv"
13-
"strings"
37+
"unsafe"
1438
)
1539

1640
// json entry
@@ -19,52 +43,37 @@ type Entry struct {
1943
Filename string `json:"filename"`
2044
}
2145

22-
func initFileIDs(fname string) []Entry {
23-
entryRe := regexp.MustCompile(`fileid__\("([^"]+)", *([0-9]+)\)`)
24-
f, err := os.Open(fname)
25-
if err != nil {
26-
fmt.Fprintf(os.Stderr, "error opening '%s': %v", fname, err)
46+
func loadFileIDs() []Entry {
47+
fileidsLen := C.get_fileids_len()
48+
cArrayPtr := C.get_fileids()
49+
if cArrayPtr == nil {
50+
fmt.Fprintf(os.Stderr, "Failed to allocate C array.")
2751
os.Exit(1)
2852
}
29-
defer f.Close()
30-
31-
ret := []Entry{}
32-
scanner := bufio.NewScanner(f)
33-
for scanner.Scan() {
34-
line := scanner.Text()
35-
if strings.HasPrefix(line, "//") {
36-
continue
37-
}
38-
39-
m := entryRe.FindStringSubmatch(line)
40-
if len(m) == 3 {
41-
id, err := strconv.ParseInt(m[2], 0, 32)
42-
if err != nil {
43-
continue
44-
}
45-
ret = append(ret, Entry{int(id), m[1]})
46-
}
47-
53+
goSlice := (*[1 << 30]C.fileid_t)(unsafe.Pointer(cArrayPtr))[:fileidsLen:fileidsLen]
54+
var ret []Entry
55+
for _, fileid := range goSlice {
56+
id := int(fileid.id)
57+
name := C.GoString(fileid.filename)
58+
ret = append(ret, Entry{id, name})
4859
}
49-
// NB: no need to check scanner.Err()
5060
return ret
5161
}
5262

5363
func main() {
54-
if len(os.Args) < 3 {
55-
fmt.Fprintf(os.Stderr, "Usage: %s <fileids.h> <out.json>\n", os.Args[0])
64+
if len(os.Args) < 2 {
65+
fmt.Fprintf(os.Stderr, "Usage: %s <out.json>\n", os.Args[0])
5666
os.Exit(1)
5767
}
5868

59-
fname := os.Args[1]
60-
fileIDs := initFileIDs(fname)
69+
fileIDs := loadFileIDs()
6170
b, err := json.MarshalIndent(fileIDs, "", " ")
6271
if err != nil {
6372
fmt.Fprintf(os.Stderr, "error marshalling file ids: %v", err)
6473
os.Exit(1)
6574
}
6675

67-
outFname := os.Args[2]
76+
outFname := os.Args[1]
6877
err = os.WriteFile(outFname, b, 0622)
6978
if err != nil {
7079
fmt.Fprintf(os.Stderr, "error writing file: %v", err)

0 commit comments

Comments
 (0)