1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 1999 Global Technology Associates, Inc. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 19 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 20 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 21 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 22 * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 23 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 24 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 25 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 26 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * $FreeBSD: stable/11/usr.sbin/kgzip/xio.c 330449 2018-03-05 07:26:05Z eadler $ 29 */ 30 31#include <err.h> 32#include <string.h> 33#include <unistd.h> 34 35#include "kgzip.h" 36 37/* 38 * Close a file. 39 */ 40void 41xclose(const struct iodesc *id) 42{ 43 if (close(id->fd)) 44 err(1, "%s", id->fname); 45} 46 47/* 48 * Copy bytes from one file to another. 49 */ 50void 51xcopy(const struct iodesc * idi, const struct iodesc * ido, 52 size_t nbyte, off_t offset) 53{ 54 char buf[8192]; 55 size_t n; 56 57 while (nbyte) { 58 if ((n = sizeof(buf)) > nbyte) 59 n = nbyte; 60 if (xread(idi, buf, n, offset) != n) 61 errx(1, "%s: Short read", idi->fname); 62 xwrite(ido, buf, n); 63 nbyte -= n; 64 offset = -1; 65 } 66} 67 68/* 69 * Write binary zeroes to a file. 70 */ 71void 72xzero(const struct iodesc * id, size_t nbyte) 73{ 74 char buf[8192]; 75 size_t n; 76 77 memset(buf, 0, sizeof(buf)); 78 while (nbyte) { 79 if ((n = sizeof(buf)) > nbyte) 80 n = nbyte; 81 xwrite(id, buf, n); 82 nbyte -= n; 83 } 84} 85 86/* 87 * Read from a file. 88 */ 89size_t 90xread(const struct iodesc * id, void *buf, size_t nbyte, off_t offset) 91{ 92 ssize_t n; 93 94 if (offset != -1 && lseek(id->fd, offset, SEEK_SET) != offset) 95 err(1, "%s", id->fname); 96 if ((n = read(id->fd, buf, nbyte)) == -1) 97 err(1, "%s", id->fname); 98 return (size_t)n; 99} 100 101/* 102 * Write to a file. 103 */ 104void 105xwrite(const struct iodesc * id, const void *buf, size_t nbyte) 106{ 107 ssize_t n; 108 109 if ((n = write(id->fd, buf, nbyte)) == -1) 110 err(1, "%s", id->fname); 111 if ((size_t)n != nbyte) 112 errx(1, "%s: Short write", id->fname); 113} 114 115/* 116 * Reposition within a file. 117 */ 118void 119xseek(const struct iodesc *id, off_t offset) 120{ 121 if (lseek(id->fd, offset, SEEK_SET) != offset) 122 err(1, "%s", id->fname); 123} 124