X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Ftests%2Fsendfile.c;h=3f5115536183dba0122ce0bace37dc84437e1e93;hb=174b9684c3f48c7f7f845b14d9452d0bf1ceaece;hp=e26c41793b1eec41523a869e3b0fa6becec9e344;hpb=3a1e40d92baeb54fa93d527af55105a1e3a4a289;p=fs%2Flustre-release.git diff --git a/lustre/tests/sendfile.c b/lustre/tests/sendfile.c index e26c417..3f51155 100644 --- a/lustre/tests/sendfile.c +++ b/lustre/tests/sendfile.c @@ -15,11 +15,7 @@ * * 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 */ @@ -50,99 +46,100 @@ 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); + 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); + return system(cmd); }