1/* 2 * Copyright (c) 1997-2014 Erez Zadok 3 * Copyright (c) 2005 Daniel P. Ottavio 4 * Copyright (c) 1989 Jan-Simon Pendry 5 * Copyright (c) 1989 Imperial College of Science, Technology & Medicine 6 * Copyright (c) 1989 The Regents of the University of California. 7 * All rights reserved. 8 * 9 * This code is derived from software contributed to Berkeley by 10 * Jan-Simon Pendry at Imperial College, London. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 3. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * 37 * File: am-utils/amd/sun2amd.c 38 * 39 */ 40 41/* 42 * Translate Sun-syntax maps to Amd maps 43 */ 44 45#ifdef HAVE_CONFIG_H 46# include <config.h> 47#endif /* HAVE_CONFIG_H */ 48#include <am_defs.h> 49#include <amd.h> 50#include <sun_map.h> 51 52 53/* dummies to make the program compile and link */ 54struct amu_global_options gopt; 55#if defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) 56# ifdef NEED_LIBWRAP_SEVERITY_VARIABLES 57/* 58 * Some systems that define libwrap already define these two variables 59 * in libwrap, while others don't: so I need to know precisely iff 60 * to define these two severity variables. 61 */ 62int allow_severity=0, deny_severity=0, rfc931_timeout=0; 63# endif /* NEED_LIBWRAP_SEVERITY_VARIABLES */ 64#endif /* defined(HAVE_TCPD_H) && defined(HAVE_LIBWRAP) */ 65 66 67/* 68 * Parse the stream sun_in, convert the map information to amd, write 69 * the results to amd_out. 70 */ 71static int 72sun2amd_convert(FILE *sun_in, FILE *amd_out) 73{ 74 char line_buff[INFO_MAX_LINE_LEN], *tmp, *key, *entry; 75 int pos, line = 0, retval = 1; 76 77 /* just to be safe */ 78 memset(line_buff, 0, sizeof(line_buff)); 79 80 /* Read the input line by line and do the conversion. */ 81 while ((pos = file_read_line(line_buff, sizeof(line_buff), sun_in))) { 82 line++; 83 line_buff[pos - 1] = '\0'; 84 85 /* remove comments */ 86 if ((tmp = strchr(line_buff, '#')) != NULL) { 87 *tmp = '\0'; 88 } 89 90 /* find start of key */ 91 key = line_buff; 92 while (*key != '\0' && isspace((unsigned char)*key)) { 93 key++; 94 } 95 96 /* ignore blank lines */ 97 if (*key == '\0') { 98 continue; 99 } 100 101 /* find the end of the key and NULL terminate */ 102 tmp = key; 103 while (*tmp != '\0' && isspace((unsigned char)*tmp) == 0) { 104 tmp++; 105 } 106 if (*tmp == '\0') { 107 plog(XLOG_ERROR, "map line %d has no entry", line); 108 goto err; 109 } 110 *tmp++ = '\0'; 111 if (*tmp == '\0') { 112 plog(XLOG_ERROR, "map line %d has no entry", line); 113 goto err; 114 } 115 entry = tmp; 116 117 /* convert the sun entry to an amd entry */ 118 if ((tmp = sun_entry2amd(key, entry)) == NULL) { 119 plog(XLOG_ERROR, "parse error on line %d", line); 120 goto err; 121 } 122 123 if (fprintf(amd_out, "%s %s\n", key, tmp) < 0) { 124 plog(XLOG_ERROR, "can't write to output stream: %s", strerror(errno)); 125 goto err; 126 } 127 128 /* just to be safe */ 129 memset(line_buff, 0, sizeof(line_buff)); 130 } 131 132 /* success */ 133 retval = 0; 134 135 err: 136 return retval; 137} 138 139 140/* 141 * wrapper open function 142 */ 143static FILE * 144sun2amd_open(const char *path, const char *mode) 145{ 146 FILE *retval = NULL; 147 148 if ((retval = fopen(path,mode)) == NULL) { 149 plog(XLOG_ERROR,"could not open file %s",path); 150 } 151 152 return retval; 153} 154 155 156/* 157 * echo the usage and exit 158 */ 159static void 160sun2amd_usage(void) 161{ 162 fprintf(stderr, 163 "usage : sun2amd [-hH] [-i infile] [-o outfile]\n" 164 "-h\thelp\n" 165 "-i\tspecify an infile (defaults to stdin)\n" 166 "-o\tspecify an outfile (defaults to stdout)\n"); 167} 168 169 170int 171main(int argc, char **argv) 172{ 173 /* default in/out to stdin/stdout */ 174 FILE *sun_in = stdin, *amd_out = stdout; 175 int opt, retval = 1; 176 177 while ((opt = getopt(argc, argv , "i:o:hH")) != -1) { 178 switch (opt) { 179 180 case 'i': 181 if ((sun_in = sun2amd_open(optarg,"r")) == NULL) { 182 goto err; 183 } 184 break; 185 186 case 'o': 187 if ((amd_out = sun2amd_open(optarg,"w")) == NULL) { 188 goto err; 189 } 190 break; 191 192 case 'h': 193 case 'H': 194 sun2amd_usage(); 195 goto err; 196 } 197 } 198 199 retval = sun2amd_convert(sun_in,amd_out); 200 201 err: 202 exit(retval); 203} 204