L4Re/departure

Annotated tests/dstest_block_client_simple.cc

90:00dc57806375
2021-04-11 Paul Boddie Changed mmap to return the file size, not the populated extent of the region. Introduced a higher-level client library for file access. Adjusted handling of the region state in the file library. Added a test of the higher-level client library.
paul@90 1
/*
paul@90 2
 * Test dataspace operations.
paul@90 3
 *
paul@90 4
 * Copyright (C) 2020, 2021 Paul Boddie <paul@boddie.org.uk>
paul@90 5
 *
paul@90 6
 * This program is free software; you can redistribute it and/or
paul@90 7
 * modify it under the terms of the GNU General Public License as
paul@90 8
 * published by the Free Software Foundation; either version 2 of
paul@90 9
 * the License, or (at your option) any later version.
paul@90 10
 *
paul@90 11
 * This program is distributed in the hope that it will be useful,
paul@90 12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
paul@90 13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
paul@90 14
 * GNU General Public License for more details.
paul@90 15
 *
paul@90 16
 * You should have received a copy of the GNU General Public License
paul@90 17
 * along with this program; if not, write to the Free Software
paul@90 18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor,
paul@90 19
 * Boston, MA  02110-1301, USA
paul@90 20
 */
paul@90 21
paul@90 22
#include <systypes/fcntl.h>
paul@90 23
paul@90 24
#include <stdio.h>
paul@90 25
paul@90 26
#include "client.h"
paul@90 27
paul@90 28
paul@90 29
paul@90 30
int main(int argc, char *argv[])
paul@90 31
{
paul@90 32
  if (argc < 2)
paul@90 33
  {
paul@90 34
    printf("Need a filename.\n");
paul@90 35
    return 1;
paul@90 36
  }
paul@90 37
paul@90 38
  /* Obtain filename and access parameters. */
paul@90 39
paul@90 40
  char *filename = argv[1];
paul@90 41
paul@90 42
  /* Invoke the open method to receive the file reference. */
paul@90 43
paul@90 44
  file_t *file = client_open(filename, O_RDWR);
paul@90 45
paul@90 46
  if (file == NULL)
paul@90 47
  {
paul@90 48
    printf("Could not obtain file.\n");
paul@90 49
    return 1;
paul@90 50
  }
paul@90 51
paul@90 52
  /* Map some memory. */
paul@90 53
paul@90 54
  void *addr = client_mmap(file, 0, 1024);
paul@90 55
paul@90 56
  if (addr == NULL)
paul@90 57
  {
paul@90 58
    printf("Could not map memory.\n");
paul@90 59
    return 1;
paul@90 60
  }
paul@90 61
paul@90 62
  printf("At mapped region from %ld to %ld with data at %ld to %ld.\n",
paul@90 63
         file->start_pos, file->end_pos, file->data_current, file->data_end);
paul@90 64
paul@90 65
  /* Copy the sampled data to another file region. */
paul@90 66
paul@90 67
  offset_t size = file->size;
paul@90 68
  char buffer[size];
paul@90 69
  offset_t nread = client_read(file, buffer, size);
paul@90 70
paul@90 71
  if (nread != size)
paul@90 72
  {
paul@90 73
    printf("Could not read entire file: %ld out of %ld bytes.\n", nread, size);
paul@90 74
    return 1;
paul@90 75
  }
paul@90 76
paul@90 77
  printf("File contents...\n");
paul@90 78
paul@90 79
  fwrite(buffer, sizeof(char), nread, stdout);
paul@90 80
paul@90 81
  printf("Copy %ld bytes to end...\n", nread);
paul@90 82
paul@90 83
  for (int times = 0; times < 10; times++)
paul@90 84
  {
paul@90 85
    printf("Copy #%d...\n", times);
paul@90 86
paul@90 87
    offset_t nwritten = client_write(file, buffer, nread);
paul@90 88
paul@90 89
    if (nwritten != nread)
paul@90 90
    {
paul@90 91
      printf("Could not write file section: %ld instead of %ld bytes.\n",
paul@90 92
             nwritten, nread);
paul@90 93
      return 1;
paul@90 94
    }
paul@90 95
  }
paul@90 96
paul@90 97
  printf("File is now %ld in size.\n", file->size);
paul@90 98
paul@90 99
  printf("Seek to start...\n");
paul@90 100
paul@90 101
  client_seek(file, 0, SEEK_SET);
paul@90 102
paul@90 103
  printf("At mapped region from %ld to %ld with data at %ld to %ld.\n",
paul@90 104
         file->start_pos, file->end_pos, file->data_current, file->data_end);
paul@90 105
paul@90 106
  printf("File contents...\n");
paul@90 107
paul@90 108
  offset_t position = 0;
paul@90 109
paul@90 110
  while (position < file->size)
paul@90 111
  {
paul@90 112
    offset_t nread = client_read(file, buffer, size);
paul@90 113
paul@90 114
    if ((nread != size) && (nread != file->size - position))
paul@90 115
    {
paul@90 116
      printf("Could not read file section: %ld instead of %ld or remaining %ld bytes.\n",
paul@90 117
             nread, size, file->size - position);
paul@90 118
      return 1;
paul@90 119
    }
paul@90 120
paul@90 121
    fwrite(buffer, sizeof(char), nread, stdout);
paul@90 122
    position += nread;
paul@90 123
  }
paul@90 124
paul@90 125
  printf("File shown.\n");
paul@90 126
paul@90 127
  return 0;
paul@90 128
}
paul@90 129
paul@90 130
// vim: tabstop=2 expandtab shiftwidth=2