L4Re/departure

Annotated tests/dstest_block_client_simple.cc

360:92c5f6aa8c36
2022-06-12 Paul Boddie Reintroduced PagerObject code generation required to initiate servers. mmap-region-flags
paul@90 1
/*
paul@90 2
 * Test dataspace operations.
paul@90 3
 *
paul@237 4
 * Copyright (C) 2020, 2021, 2022 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@106 25
#include <stdlib.h>
paul@151 26
#include <string.h>
paul@90 27
paul@94 28
#include <fsclient/client.h>
paul@90 29
paul@90 30
paul@90 31
paul@90 32
int main(int argc, char *argv[])
paul@90 33
{
paul@90 34
  if (argc < 2)
paul@90 35
  {
paul@237 36
    printf("Need a filename and optional repetition.\n");
paul@90 37
    return 1;
paul@90 38
  }
paul@90 39
paul@90 40
  /* Obtain filename and access parameters. */
paul@90 41
paul@90 42
  char *filename = argv[1];
paul@237 43
  int repetition = argc > 2 ? atoi(argv[2]) : 10;
paul@144 44
  file_t *file;
paul@144 45
paul@237 46
  file = client_open(filename, O_RDWR);
paul@90 47
paul@90 48
  if (file == NULL)
paul@90 49
  {
paul@90 50
    printf("Could not obtain file.\n");
paul@90 51
    return 1;
paul@90 52
  }
paul@90 53
paul@90 54
  /* Copy the sampled data to another file region. */
paul@90 55
paul@90 56
  offset_t size = file->size;
paul@90 57
  char buffer[size];
paul@90 58
  offset_t nread = client_read(file, buffer, size);
paul@90 59
paul@90 60
  if (nread != size)
paul@90 61
  {
paul@90 62
    printf("Could not read entire file: %ld out of %ld bytes.\n", nread, size);
paul@90 63
    return 1;
paul@90 64
  }
paul@90 65
paul@90 66
  printf("File contents...\n");
paul@90 67
paul@90 68
  fwrite(buffer, sizeof(char), nread, stdout);
paul@90 69
paul@90 70
  printf("Copy %ld bytes to end...\n", nread);
paul@90 71
paul@106 72
  for (int times = 0; times < repetition; times++)
paul@90 73
  {
paul@90 74
    printf("Copy #%d...\n", times);
paul@90 75
paul@90 76
    offset_t nwritten = client_write(file, buffer, nread);
paul@90 77
paul@90 78
    if (nwritten != nread)
paul@90 79
    {
paul@90 80
      printf("Could not write file section: %ld instead of %ld bytes.\n",
paul@90 81
             nwritten, nread);
paul@90 82
      return 1;
paul@90 83
    }
paul@90 84
  }
paul@90 85
paul@90 86
  printf("File is now %ld in size.\n", file->size);
paul@90 87
paul@90 88
  printf("Seek to start...\n");
paul@90 89
paul@90 90
  client_seek(file, 0, SEEK_SET);
paul@90 91
paul@90 92
  printf("At mapped region from %ld to %ld with data at %ld to %ld.\n",
paul@90 93
         file->start_pos, file->end_pos, file->data_current, file->data_end);
paul@90 94
paul@90 95
  printf("File contents...\n");
paul@90 96
paul@90 97
  offset_t position = 0;
paul@90 98
paul@90 99
  while (position < file->size)
paul@90 100
  {
paul@90 101
    offset_t nread = client_read(file, buffer, size);
paul@90 102
paul@90 103
    if ((nread != size) && (nread != file->size - position))
paul@90 104
    {
paul@90 105
      printf("Could not read file section: %ld instead of %ld or remaining %ld bytes.\n",
paul@90 106
             nread, size, file->size - position);
paul@90 107
      return 1;
paul@90 108
    }
paul@90 109
paul@90 110
    fwrite(buffer, sizeof(char), nread, stdout);
paul@90 111
    position += nread;
paul@90 112
  }
paul@90 113
paul@90 114
  printf("File shown.\n");
paul@90 115
paul@90 116
  return 0;
paul@90 117
}
paul@90 118
paul@90 119
// vim: tabstop=2 expandtab shiftwidth=2