File: sendfilev.c

package info (click to toggle)
valgrind 1%3A3.24.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 176,332 kB
  • sloc: ansic: 795,029; exp: 26,134; xml: 23,472; asm: 14,393; cpp: 9,397; makefile: 7,464; sh: 6,122; perl: 5,446; python: 1,498; javascript: 981; awk: 166; csh: 1
file content (88 lines) | stat: -rw-r--r-- 2,293 bytes parent folder | download | duplicates (7)
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
77
78
79
80
81
82
83
84
85
86
87
88
/* Tests sendfilev with bogus inputs. */

#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <sys/sendfile.h>

#define CHUNK (8 * 1024)
#define TEST_FILE "sendfile.test"

int main(int argc, const char *argv[])
{
   int test_fd = open(TEST_FILE, O_WRONLY | O_CREAT, 0666);
   if (test_fd < 0) {
      int error = errno;
      fprintf(stderr, "open failed: %s (%d).\n", strerror(error), error);
      return 1;
   }

   char chunk1[CHUNK];
   bzero(&chunk1, sizeof(chunk1));
   ssize_t nbytes = write(test_fd, &chunk1, sizeof(chunk1));
   if (nbytes != CHUNK) {
      int error = errno;
      fprintf(stderr, "write failed (nbytes=%zd): %s (%d).\n",
              nbytes, strerror(error), error);
      return 1;
   }

   close(test_fd);
   printf("Test file created.\n"); 

   test_fd = open(TEST_FILE, O_RDWR, 0666);
   if (test_fd < 0) {
      int error = errno;
      fprintf(stderr, "open failed: %s (%d).\n", strerror(error), error);
      return 1;
   }

   sendfilevec_t vec[2];
   vec[0].sfv_fd = SFV_FD_SELF;
   vec[0].sfv_off = -1;
   vec[0].sfv_len = 1;
   vec[0].sfv_flag = 0;
   vec[1].sfv_fd = test_fd;
   vec[1].sfv_off = 0;
   vec[1].sfv_len = CHUNK;
   vec[1].sfv_flag = 0;
   size_t xferred;

   nbytes = sendfilev(test_fd, vec, 2, &xferred);
   if (nbytes < 0) {
      if (errno == EFAULT) {
         printf("Received EFAULT as expected.\n");
      } else {
         fprintf(stderr, "Expected EFAULT, got %d.\n", errno);
      }
   } else {
      fprintf(stderr, "Error: sendfilev returned a positive value.\n");
   }

   nbytes = sendfilev(test_fd, vec, -1, &xferred);
   if (nbytes < 0) {
      if (errno == EINVAL) {
         printf("Received EINVAL as expected.\n");
      } else {
         fprintf(stderr, "Expected EINVAL, got %d.\n", errno);
      }
   } else {
      fprintf(stderr, "Error: sendfilev returned a positive value.\n");
   }

   vec[0].sfv_off = (off_t) "HEADER";
   vec[0].sfv_len = 6;
   nbytes = sendfilev(test_fd, vec, 1, &xferred);
   if (nbytes < 0) {
      int error = errno;
      fprintf(stderr, "sendfilev failed: %s (%d).\n", strerror(error), error);
   } else {
      printf("sendfilev for the first buffer succeeded.\n");
   }

   unlink(TEST_FILE);
   return 0;
}