summaryrefslogtreecommitdiff
path: root/acpi/func_files.c
blob: 371f989a1ad554b714dc57055c66d6474a7985e5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
   Copyright (C) 2017 Free Software Foundation, Inc.

   This file is part of the GNU Hurd.

   The GNU Hurd is free software; you can redistribute it and/or
   modify it under the terms of the GNU General Public License as
   published by the Free Software Foundation; either version 2, or (at
   your option) any later version.

   The GNU Hurd is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with the GNU Hurd.  If not, see <<a rel="nofollow" href="http://www.gnu.org/licenses/">http://www.gnu.org/licenses/</a>>.
*/

/*
 * Per-function files implementation.
 *
 * Implementation of all files repeated for each function.
 */

#include <func_files.h>
#include <assert.h>

/* Read an acpi table */
error_t
io_acpi_table (struct acpi_table *t, off_t offset, size_t *len, void *data)
{
  error_t err;
  size_t datalen;

  /* This should never happen */
  assert_backtrace (t != 0);

  datalen = t->datalen;

  /* Don't exceed the size of the acpi table */
  if (offset > datalen)
    return EINVAL;
  if ((offset + *len) > datalen)
    *len = datalen - offset;

  memcpy (data, t->data + offset, *len);

  return err;
}

/* Read from an acpi table file */
error_t
io_acpi_file (struct acpifs_dirent *e, off_t offset, size_t *len,
              void *data)
{
  size_t datalen;
  struct acpi_table *table;

  /* This should never happen */
  assert_backtrace (e->acpitable != 0);

  /* Get the table */
  table = e->acpitable;

  datalen = table->datalen;
  /* Don't exceed the region size */
  if (offset > datalen)
    return EINVAL;
  if ((offset + *len) > datalen)
    *len = datalen - offset;

  memcpy (data, table->data + offset, *len);

  return 0;
}