1498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak/*
24b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * Copyright (c) International Business Machines  Corp., 2001
34b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * Copyright (c) Red Hat Inc., 2007
4498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak *
54b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * This program is free software;  you can redistribute it and/or modify
64b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * it under the terms of the GNU General Public License as published by
74b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * the Free Software Foundation; either version 2 of the License, or
84b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * (at your option) any later version.
9498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak *
104b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * This program is distributed in the hope that it will be useful,
114b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * but WITHOUT ANY WARRANTY;  without even the implied warranty of
124b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
134b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * the GNU General Public License for more details.
14498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak *
154b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * You should have received a copy of the GNU General Public License
164b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * along with this program;  if not, write to the Free Software Foundation,
174b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak */
19498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
20498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak/*
21498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak * DESCRIPTION
224bb656a129f7507823e9e6d6b98b1a02fd80ef89subrata_modak *	Testcase to test that sendfile(2) system call updates file
23498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak *	position of in_fd correctly when passing NULL as offset.
24498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak *
25498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak * HISTORY
26498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak *	11/2007 Copyed from sendfile02.c by Masatake YAMATO
27498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak */
284b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
29923b23ff1fd1b77bd895949f9a6b4508c6485f33subrata_modak#include <inttypes.h>
30498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <stdio.h>
31498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <errno.h>
32498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <fcntl.h>
33498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <sys/stat.h>
34498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <sys/sendfile.h>
35498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <sys/types.h>
36498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <sys/wait.h>
37498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <sys/socket.h>
38498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <sys/mman.h>
39498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <netinet/in.h>
40498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include <arpa/inet.h>
414b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis#include <string.h>
42498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#include "test.h"
434b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis#include "safe_macros.h"
44498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
45585950c9ec810ae2c6c5d5dad2135ee2cf72d37bsubrata_modakTCID_DEFINE(sendfile06);
46498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
474b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis#define IN_FILE		"infile"
484b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis#define OUT_FILE	"outfile"
494b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
504b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic pid_t child_pid;
514b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic int sockfd;
524b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic struct sockaddr_in sin1;
534b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic struct stat sb;
54498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
554b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void cleanup(void);
564b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void do_child(void);
574b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void setup(void);
584b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic int create_server(void);
59498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
60498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modakint TST_TOTAL = 1;
61498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
62498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#ifdef UCLINUX
6356207cec7732e09c216c751c0b5f88a242bacae6subrata_modakstatic char *argv0;
64498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#endif
65498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
664b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void do_sendfile(void)
67498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak{
684b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	int in_fd, out_fd;
69498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	off_t after_pos;
70498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	int wait_stat;
71498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
72498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	out_fd = create_server();
73498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
744b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	in_fd = SAFE_OPEN(cleanup, IN_FILE, O_RDONLY);
75498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
76498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	TEST(sendfile(out_fd, in_fd, NULL, sb.st_size));
77498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	if ((after_pos = lseek(in_fd, 0, SEEK_CUR)) < 0) {
7856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		tst_brkm(TBROK, cleanup,
7956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 "lseek after invoking sendfile failed: %d", errno);
80354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
81498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
82e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis	/* Close the sockets */
83e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis	shutdown(sockfd, SHUT_RDWR);
844b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	shutdown(out_fd, SHUT_RDWR);
85e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis	if (TEST_RETURN != sb.st_size) {
86e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		tst_resm(TFAIL, "sendfile(2) failed to return "
87e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 "expected value, expected: %" PRId64 ", "
88e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 "got: %ld", (int64_t) sb.st_size, TEST_RETURN);
894b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		SAFE_KILL(cleanup, child_pid, SIGKILL);
90e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis	} else if (after_pos != sb.st_size) {
91e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		tst_resm(TFAIL, "sendfile(2) failed to update "
92e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 " the file position of in_fd, "
93e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 "expected file position: %" PRId64 ", "
94e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 "actual file position %" PRId64,
95e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 (int64_t) sb.st_size, (int64_t) after_pos);
964b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		SAFE_KILL(cleanup, child_pid, SIGKILL);
97498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	} else {
98e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis		tst_resm(TPASS, "functionality of sendfile() is "
99e38b961c385192f0d804914b77bd590734b42e75Cyril Hrubis			 "correct");
1004b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		waitpid(-1, &wait_stat, 0);
101498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
102498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
1034b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	SAFE_CLOSE(cleanup, in_fd);
1044b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	SAFE_CLOSE(cleanup, out_fd);
1054b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	SAFE_CLOSE(cleanup, sockfd);
106498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak}
107498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
1084b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void do_child(void)
109498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak{
1104b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	socklen_t length = sizeof(sin1);
111498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	char rbuf[4096];
1124b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	ssize_t ret, bytes_total_received = 0;
1134b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
1144b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	while (bytes_total_received < sb.st_size) {
1154b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		ret = recvfrom(sockfd, rbuf, 4096, 0, (struct sockaddr *)&sin1,
1164b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis			       &length);
1174b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		if (ret < 0) {
1184b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis			fprintf(stderr, "child process recvfrom failed: %s\n",
1194b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis				strerror(errno));
1204b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis			exit(1);
1214b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		}
1224b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis		bytes_total_received += ret;
123498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
1244b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
125498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	exit(0);
126498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak}
127498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
1284b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void setup(void)
129498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak{
130498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	int fd;
131498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
132498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	tst_sig(FORK, DEF_HANDLER, cleanup);
133498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
134498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	TEST_PAUSE;
135498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
136498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	tst_tmpdir();
1374b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
1384b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	fd = SAFE_CREAT(cleanup, IN_FILE, 0600);
1394b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
1404b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	SAFE_WRITE(cleanup, 1, fd, "abcdefghijklmnopqrstuvwxyz", 26);
1414b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
1424b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	SAFE_FSTAT(cleanup, fd, &sb);
1434b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
1444b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	SAFE_CLOSE(cleanup, fd);
145498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak}
146498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
1474b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic void cleanup(void)
148498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak{
149498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	tst_rmdir();
150498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak}
151498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
1524b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubisstatic int create_server(void)
15356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak{
1544b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	int s;
1556e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	socklen_t slen = sizeof(sin1);
156498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
157498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	sockfd = socket(PF_INET, SOCK_DGRAM, 0);
15856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (sockfd < 0) {
159498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		tst_brkm(TBROK, cleanup, "call to socket() failed: %s",
16056207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 strerror(errno));
161498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		return -1;
162498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
163498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	sin1.sin_family = AF_INET;
1646e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek	sin1.sin_port = 0; /* pick random free port */
165498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	sin1.sin_addr.s_addr = INADDR_ANY;
1664b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
16756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (bind(sockfd, (struct sockaddr *)&sin1, sizeof(sin1)) < 0) {
168498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		tst_brkm(TBROK, cleanup, "call to bind() failed: %s",
16956207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 strerror(errno));
170498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		return -1;
171498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
172e74013a59a7991cffff55889f634413e92cfbc91Cyril Hrubis	SAFE_GETSOCKNAME(cleanup, sockfd, (struct sockaddr *)&sin1, &slen);
1736e4e77a974ebeaa5704fa6d127e163a484b12607Jan Stancek
174498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	child_pid = FORK_OR_VFORK();
17556207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (child_pid < 0) {
176498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
17756207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 strerror(errno));
178498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		return -1;
179498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
1804b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
1814b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	if (!child_pid) {
182498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#ifdef UCLINUX
18356207cec7732e09c216c751c0b5f88a242bacae6subrata_modak		if (self_exec(argv0, "") < 0) {
184498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak			tst_brkm(TBROK, cleanup, "self_exec failed");
185498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak			return -1;
18656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak
187498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		}
188498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#else
189498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		do_child();
190498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#endif
191498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
192498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
193498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	s = socket(PF_INET, SOCK_DGRAM, 0);
194498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	inet_aton("127.0.0.1", &sin1.sin_addr);
1954b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
19656207cec7732e09c216c751c0b5f88a242bacae6subrata_modak	if (s < 0) {
197498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		tst_brkm(TBROK, cleanup, "call to socket() failed: %s",
19856207cec7732e09c216c751c0b5f88a242bacae6subrata_modak			 strerror(errno));
199498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		return -1;
200498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
2014b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
20259c9acba8a6908776f84d1f54a82e7f31c653d9cCyril Hrubis	SAFE_CONNECT(cleanup, s, (struct sockaddr *)&sin1, sizeof(sin1));
203498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
2044b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	return s;
205498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak}
206498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
207498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modakint main(int ac, char **av)
208498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak{
20989af32a63ce8a780ea39337339e14caae244b5a4Cyril Hrubis	int lc;
210498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
211d6d11d08678aac1ed2c370ea8e42e5f45aea07beCyril Hrubis	tst_parse_opts(ac, av, NULL, NULL);
2124b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis
213498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#ifdef UCLINUX
214498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	argv0 = av[0];
215498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	maybe_run_child(&do_child, "");
216498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak#endif
217498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
218498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	setup();
219498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
220498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	for (lc = 0; TEST_LOOPING(lc); lc++) {
221d59a659cd639ca2780b00049d102acd2a783d585Caspar Zhang		tst_count = 0;
222498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
223498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak		do_sendfile();
224498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak	}
225498546d71eeb3c7aa78f0f8cf2c3f3e6e5ccf72bsubrata_modak
2264b649da6298461bf29f0fdb7004ec5479ae5c93bCyril Hrubis	cleanup();
22753740500924f6439623a8ac256b5be2d6c59ed1fGarrett Cooper	tst_exit();
228ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
229