ttyrex

ttyrec with more options
git clone https://a3nm.net/git/ttyrex/
Log | Files | Refs | README

io.c (3958B)


      1 /*
      2  * Copyright (c) 2000 Satoru Takabayashi <satoru@namazu.org>
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *	This product includes software developed by the University of
     16  *	California, Berkeley and its contributors.
     17  * 4. Neither the name of the University nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #include <assert.h>
     35 #include <errno.h>
     36 #include <endian.h>
     37 #include <stdint.h>
     38 #include <stdio.h>
     39 #include <stdlib.h>
     40 #include <string.h>
     41 #include <unistd.h>
     42 
     43 #include "ttyrec.h"
     44 
     45 #define SWAP_ENDIAN(val) ((uint32_t) ( \
     46     (((uint32_t) (val) & (uint32_t) 0x000000ffU) << 24) | \
     47     (((uint32_t) (val) & (uint32_t) 0x0000ff00U) <<  8) | \
     48     (((uint32_t) (val) & (uint32_t) 0x00ff0000U) >>  8) | \
     49     (((uint32_t) (val) & (uint32_t) 0xff000000U) >> 24)))
     50 
     51 static uint32_t
     52 convert_to_little_endian (uint32_t x)
     53 {
     54 #if BYTE_ORDER == LITTLE_ENDIAN
     55   return x;
     56 #else
     57   return SWAP_ENDIAN(x);
     58 #endif
     59 }
     60 
     61 int
     62 read_header (FILE *fp, Header *h)
     63 {
     64     uint32_t buf[3];
     65 
     66     if (fread(buf, sizeof(uint32_t), 3, fp) == 0) {
     67 	return 0;
     68     }
     69 
     70     h->tv.tv_sec  = convert_to_little_endian(buf[0]);
     71     h->tv.tv_usec = convert_to_little_endian(buf[1]);
     72     h->len        = convert_to_little_endian(buf[2]);
     73 
     74     return 1;
     75 }
     76 
     77 int
     78 write_header (FILE *fp, Header *h)
     79 {
     80     uint32_t buf[3];
     81 
     82     buf[0] = convert_to_little_endian(h->tv.tv_sec);
     83     buf[1] = convert_to_little_endian(h->tv.tv_usec);
     84     buf[2] = convert_to_little_endian(h->len);
     85 
     86     if (fwrite(buf, sizeof(uint32_t), 3, fp) == 0) {
     87 	return 0;
     88     }
     89 
     90     return 1;
     91 }
     92 
     93 static char *progname = "";
     94 void
     95 set_progname (const char *name)
     96 {
     97     progname = strdup(name);
     98 }
     99 
    100 FILE *
    101 efopen (const char *path, const char *mode)
    102 {
    103     FILE *fp = fopen(path, mode);
    104     if (fp == NULL) {
    105 	fprintf(stderr, "%s: %s: %s\n", progname, path, strerror(errno));
    106 	exit(EXIT_FAILURE);
    107     }
    108     return fp;
    109 }
    110 
    111 int
    112 edup (int oldfd)
    113 {
    114     int fd = dup(oldfd);
    115     if (fd == -1) {
    116 	fprintf(stderr, "%s: dup failed: %s\n", progname, strerror(errno));
    117 	exit(EXIT_FAILURE);
    118     }
    119     return fd;
    120 }
    121 
    122 int
    123 edup2 (int oldfd, int newfd)
    124 {
    125     int fd = dup2(oldfd, newfd);
    126     if (fd == -1) {
    127 	fprintf(stderr, "%s: dup2 failed: %s\n", progname, strerror(errno));
    128 	exit(EXIT_FAILURE);
    129     }
    130     return fd;
    131 }
    132 
    133 FILE *
    134 efdopen (int fd, const char *mode)
    135 {
    136     FILE *fp = fdopen(fd, mode);
    137     if (fp == NULL) {
    138 	fprintf(stderr, "%s: fdopen failed: %s\n", progname, strerror(errno));
    139 	exit(EXIT_FAILURE);
    140     }
    141     return fp;
    142 }