L4Re/departure

Annotated tests/dstest_block_client_simple.cc

151:d596a1948294
2021-08-01 Paul Boddie Introduced usage of the filesystem factory operation in the relevant tests.
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@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@144 36
    printf("Need a filename, optional user identifier, 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@151 43
  bool have_uid = (argc > 2) && strlen(argv[2]);
paul@151 44
  sys_uid_t uid = have_uid ? atoi(argv[2]) : 0;
paul@144 45
  int repetition = argc > 3 ? atoi(argv[3]) : 10;
paul@144 46
  file_t *file;
paul@144 47
paul@144 48
  /* With a user, open a user-specific file opener. */
paul@144 49
paul@151 50
  if (have_uid)
paul@144 51
  {
paul@150 52
    l4_cap_idx_t opener = client_open_for_user((user_t) {uid, uid, 0022});
paul@90 53
paul@144 54
    if (l4_is_invalid_cap(opener))
paul@144 55
    {
paul@144 56
      printf("Could not obtain opener for file.\n");
paul@144 57
      return 1;
paul@144 58
    }
paul@90 59
paul@144 60
    /* Invoke the open method to receive the file reference. */
paul@144 61
paul@144 62
    file = client_open_using(filename, O_RDWR, opener);
paul@144 63
  }
paul@144 64
  else
paul@144 65
    file = client_open(filename, O_RDWR);
paul@90 66
paul@90 67
  if (file == NULL)
paul@90 68
  {
paul@90 69
    printf("Could not obtain file.\n");
paul@90 70
    return 1;
paul@90 71
  }
paul@90 72
paul@90 73
  /* Copy the sampled data to another file region. */
paul@90 74
paul@90 75
  offset_t size = file->size;
paul@90 76
  char buffer[size];
paul@90 77
  offset_t nread = client_read(file, buffer, size);
paul@90 78
paul@90 79
  if (nread != size)
paul@90 80
  {
paul@90 81
    printf("Could not read entire file: %ld out of %ld bytes.\n", nread, size);
paul@90 82
    return 1;
paul@90 83
  }
paul@90 84
paul@90 85
  printf("File contents...\n");
paul@90 86
paul@90 87
  fwrite(buffer, sizeof(char), nread, stdout);
paul@90 88
paul@90 89
  printf("Copy %ld bytes to end...\n", nread);
paul@90 90
paul@106 91
  for (int times = 0; times < repetition; times++)
paul@90 92
  {
paul@90 93
    printf("Copy #%d...\n", times);
paul@90 94
paul@90 95
    offset_t nwritten = client_write(file, buffer, nread);
paul@90 96
paul@90 97
    if (nwritten != nread)
paul@90 98
    {
paul@90 99
      printf("Could not write file section: %ld instead of %ld bytes.\n",
paul@90 100
             nwritten, nread);
paul@90 101
      return 1;
paul@90 102
    }
paul@90 103
  }
paul@90 104
paul@90 105
  printf("File is now %ld in size.\n", file->size);
paul@90 106
paul@90 107
  printf("Seek to start...\n");
paul@90 108
paul@90 109
  client_seek(file, 0, SEEK_SET);
paul@90 110
paul@90 111
  printf("At mapped region from %ld to %ld with data at %ld to %ld.\n",
paul@90 112
         file->start_pos, file->end_pos, file->data_current, file->data_end);
paul@90 113
paul@90 114
  printf("File contents...\n");
paul@90 115
paul@90 116
  offset_t position = 0;
paul@90 117
paul@90 118
  while (position < file->size)
paul@90 119
  {
paul@90 120
    offset_t nread = client_read(file, buffer, size);
paul@90 121
paul@90 122
    if ((nread != size) && (nread != file->size - position))
paul@90 123
    {
paul@90 124
      printf("Could not read file section: %ld instead of %ld or remaining %ld bytes.\n",
paul@90 125
             nread, size, file->size - position);
paul@90 126
      return 1;
paul@90 127
    }
paul@90 128
paul@90 129
    fwrite(buffer, sizeof(char), nread, stdout);
paul@90 130
    position += nread;
paul@90 131
  }
paul@90 132
paul@90 133
  printf("File shown.\n");
paul@90 134
paul@90 135
  return 0;
paul@90 136
}
paul@90 137
paul@90 138
// vim: tabstop=2 expandtab shiftwidth=2