Coverage Report

Created: 2026-06-10 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/numactl/sysfs.c
Line
Count
Source
1
/* Utility functions for reading sysfs values */
2
#define _GNU_SOURCE
3
#include <fcntl.h>
4
#include <stdio.h>
5
#include <stdlib.h>
6
#include <unistd.h>
7
#include <stdarg.h>
8
#include <ctype.h>
9
#include "numa.h"
10
#include "numaint.h"
11
12
54
#define SYSFS_BLOCK 4096
13
14
hidden char *sysfs_read(char *name)
15
27
{
16
27
  char *buf;
17
27
  int n;
18
27
  int fd;
19
20
27
  buf = malloc(SYSFS_BLOCK);
21
27
  if (!buf)
22
0
    return NULL;
23
27
  fd = open(name, O_RDONLY);
24
27
  n = read(fd, buf, SYSFS_BLOCK - 1);
25
27
  close(fd);
26
27
  if (n <= 0) {
27
27
    free(buf);
28
27
    return NULL;
29
27
  }
30
0
  buf[n] = 0;
31
0
  return buf;
32
27
}
33
34
hidden int sysfs_node_read(struct bitmask *mask, char *fmt, ...)
35
27
{
36
27
  int n, ret = 0;
37
27
  va_list ap;
38
27
  char *p, *fn, *m, *end;
39
27
  int num;
40
41
27
  va_start(ap, fmt);
42
27
  n = vasprintf(&fn, fmt, ap);
43
27
  va_end(ap);
44
27
  if (n < 0)
45
0
    return -1;
46
27
  p = sysfs_read(fn);
47
27
  free(fn);
48
27
  if (!p)
49
27
    return -1;
50
51
0
  m = p;
52
0
  do {
53
0
    num = strtol(m, &end, 0);
54
0
    if (m == end) {
55
0
      ret = -1;
56
0
      goto out;
57
0
    }
58
0
    if (num < 0) {
59
0
      ret = -2;
60
0
      goto out;
61
0
    }
62
0
    if (num >= numa_num_task_nodes()) {
63
0
      ret = -1;
64
0
      goto out;
65
0
    }
66
0
    numa_bitmask_setbit(mask, num);
67
68
    /* Continuation not supported by kernel yet. */
69
0
    m = end;
70
0
    while (isspace(*m) || *m == ',')
71
0
      m++;
72
0
  } while (isdigit(*m));
73
0
out:
74
0
  free(p);
75
0
  return ret;
76
0
}