X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Ftests%2Fsendfile.c;h=028f02cba8eb6f0386e92efbba483619e289866e;hb=4a4d888a07da2eaec5723473cdc5440768b4a9e3;hp=5cfa1108752fe42c87900cb4239c3b34916622a0;hpb=fbf5870b9848929d352460f1f005b79c0b5ccc5a;p=fs%2Flustre-release.git diff --git a/lustre/tests/sendfile.c b/lustre/tests/sendfile.c index 5cfa110..028f02c 100644 --- a/lustre/tests/sendfile.c +++ b/lustre/tests/sendfile.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -17,137 +15,130 @@ * * You should have received a copy of the GNU General Public License * version 2 along with this program; If not, see - * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf - * - * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, - * CA 95054 USA or visit www.sun.com if you need additional information or - * have any questions. + * http://www.gnu.org/licenses/gpl-2.0.html * * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* * This file is part of Lustre, http://www.lustre.org/ - * Lustre is a trademark of Sun Microsystems, Inc. */ #include #include #include #include +#include +#include #include #include #include #include #include -#include -#include -#include -#include -#include -#include +#include #define syserr(str) { perror(str); exit(-1); } int main(int argc, char *argv[]) { - char *sfile, *tfile; - struct stat stbuf; - int size; - unsigned long bufsize = 1024 * 1024; - int infd, outfd; - int sd[2]; - int rc; - char *buf; - char cmd[1024]; - loff_t pos; - - if (argc < 3) { - fprintf(stderr, "%s \n", argv[0]); - exit(-1); - } - - sfile = argv[1]; - tfile = argv[2]; - - if (stat(sfile, &stbuf) < 0) { - if (errno == ENOENT) { - /* assume doing non-object file testing */ - infd = open(sfile, O_LOV_DELAY_CREATE|O_CREAT|O_RDWR, - 0644); - if (infd < 0) - syserr("open source file:"); - - size = random() % (1 * 1024 * 1024) + 1024; - if (ftruncate(infd, (off_t)size) < 0) - syserr("truncate file error:"); - } else { - syserr("stat file: "); - } - } else if (S_ISREG(stbuf.st_mode)) { - size = (int)stbuf.st_size; - infd = open(sfile, O_RDONLY, 0644); - if (infd < 0) - syserr("Open an existing file error:"); - } else { - fprintf(stderr, "%s is not a regular file\n", sfile); - exit(-1); - } - - outfd = open(tfile, O_WRONLY|O_TRUNC|O_CREAT, 0666); - if (outfd < 0) - syserr("open dest file:"); - - rc = socketpair(AF_LOCAL, SOCK_STREAM, 0, sd); - if (rc < 0) - syserr("socketpair"); - - rc = fcntl(sd[0], F_SETFL, O_NONBLOCK); - if (rc < 0) - syserr("fcntl"); - - rc = setsockopt(sd[0], SOL_SOCKET, SO_SNDBUF, - &bufsize, sizeof(bufsize)); - if (rc) - syserr("setsockopt"); - - srandom(time(NULL)); - - pos = 0; - while (size > 0) { - int rc2; - size_t seg_size; - - seg_size = random() % bufsize + 1; - if (seg_size > size) - seg_size = size; - - while (seg_size) { - rc = sendfile(sd[0], infd, &pos, seg_size); - if (rc < 0) - syserr("sendfile:"); - - seg_size -= rc; - size -= rc; - if (size == 0) - close(sd[0]); - - buf = malloc(rc); - if (read(sd[1], buf, rc) < 0) - syserr("read from socket:"); - - rc2 = write(outfd, buf, rc); - if (rc2 != rc) - syserr("write dest file error:"); - free(buf); - } - } - close(sd[1]), close(infd), close(outfd); - - sprintf(cmd, "cmp %s %s\n", sfile, tfile); - return system(cmd); + char *sfile, *tfile; + struct stat stbuf; + int size; + unsigned long bufsize = 1024 * 1024; + int infd, outfd; + int sd[2]; + int rc; + char *buf; + char cmd[1024]; + loff_t pos; + + if (argc < 3) { + fprintf(stderr, "%s \n", argv[0]); + exit(-1); + } + + sfile = argv[1]; + tfile = argv[2]; + + if (stat(sfile, &stbuf) < 0) { + if (errno == ENOENT) { + /* assume doing non-object file testing */ + infd = open(sfile, + O_LOV_DELAY_CREATE | O_CREAT | O_RDWR, + 0644); + if (infd < 0) + syserr("open source file:"); + + size = random() % (1 * 1024 * 1024) + 1024; + if (ftruncate(infd, (off_t)size) < 0) + syserr("truncate file error:"); + } else { + syserr("stat file: "); + } + } else if (S_ISREG(stbuf.st_mode)) { + size = (int)stbuf.st_size; + infd = open(sfile, O_RDONLY, 0644); + if (infd < 0) + syserr("Open an existing file error:"); + } else { + fprintf(stderr, "%s is not a regular file\n", sfile); + exit(-1); + } + + outfd = open(tfile, O_WRONLY | O_TRUNC | O_CREAT, 0666); + if (outfd < 0) + syserr("open dest file:"); + + rc = socketpair(AF_LOCAL, SOCK_STREAM, 0, sd); + if (rc < 0) + syserr("socketpair"); + + rc = fcntl(sd[0], F_SETFL, O_NONBLOCK); + if (rc < 0) + syserr("fcntl"); + + rc = setsockopt(sd[0], SOL_SOCKET, SO_SNDBUF, + &bufsize, sizeof(bufsize)); + if (rc) + syserr("setsockopt"); + + srandom(time(NULL)); + + pos = 0; + while (size > 0) { + int rc2; + size_t seg_size; + + seg_size = random() % bufsize + 1; + if (seg_size > size) + seg_size = size; + + while (seg_size) { + rc = sendfile(sd[0], infd, &pos, seg_size); + if (rc < 0) + syserr("sendfile:"); + + seg_size -= rc; + size -= rc; + if (size == 0) + close(sd[0]); + + buf = malloc(rc); + if (read(sd[1], buf, rc) < 0) + syserr("read from socket:"); + + rc2 = write(outfd, buf, rc); + if (rc2 != rc) + syserr("write dest file error:"); + free(buf); + } + } + close(sd[1]), close(infd), close(outfd); + + snprintf(cmd, sizeof(cmd), "cmp %s %s\n", sfile, tfile); + return system(cmd); }