1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #include <stdio.h>
28 #include <stdlib.h>
29 #include <string.h>
30 #include <locale.h>
31 #include <sys/file.h>
32 #include <fcntl.h>
33 #include <errno.h>
34 
35 extern char *optarg;
36 
37 /*
38  * FUNCTION:
39  *	static char *_file_getline(FILE *fp)
40  * INPUT:
41  *	FILE *fp - file pointer to read from
42  * OUTPUT:
43  *	char *(return) - an entry from the stream
44  * DESCRIPTION:
45  *	This routine will read in a line at a time.  If the line ends in a
46  *	newline, it returns.  If the line ends in a backslash newline, it
47  *	continues reading more.  It will ignore lines that start in # or
48  *	blank lines.
49  */
50 static char *
_file_getline(FILE * fp)51 _file_getline(FILE *fp)
52 {
53 	char entry[BUFSIZ], *tmp;
54 	int size;
55 
56 	size = sizeof (entry);
57 	tmp  = entry;
58 
59 	/* find an entry */
60 	while (fgets(tmp, size, fp)) {
61 		if ((tmp == entry) && ((*tmp == '#') || (*tmp == '\n'))) {
62 			continue;
63 		} else {
64 			if ((*tmp == '#') || (*tmp == '\n')) {
65 				*tmp = '\0';
66 				break;
67 			}
68 
69 			size -= strlen(tmp);
70 			tmp += strlen(tmp);
71 
72 			if (*(tmp-2) != '\\')
73 				break;
74 
75 			size -= 2;
76 			tmp -= 2;
77 		}
78 	}
79 
80 	if (tmp == entry)
81 		return (NULL);
82 	else
83 		return (strdup(entry));
84 }
85 
86 int
main(int ac,char * av[])87 main(int ac, char *av[])
88 {
89 	int   c;
90 	char  file[80], ofile[80];
91 	char *cp;
92 	FILE *fp, *fp2;
93 
94 	(void) setlocale(LC_ALL, "");
95 
96 #if	!defined(TEXT_DOMAIN)
97 #define	TEXT_DOMAIN "SYS_TEST"
98 #endif
99 	(void) textdomain(TEXT_DOMAIN);
100 
101 	while ((c = getopt(ac, av, "f:o:")) != EOF)
102 
103 		switch (c) {
104 		case 'f':
105 			(void) strlcpy(file, optarg, sizeof (file));
106 			break;
107 		case 'o':
108 			(void) strlcpy(ofile, optarg, sizeof (ofile));
109 			break;
110 		default:
111 			(void) fprintf(stderr, gettext(
112 				"Usage: %s [-f file] [-o output file]\n"),
113 				av[0]);
114 			return (1);
115 		}
116 
117 	if ((fp = fopen(file, "r")) != NULL) {
118 		int fd;
119 
120 		fd = open(ofile, O_RDWR|O_APPEND);
121 		if ((fd < 0) && (errno == ENOENT))
122 			fd = open(ofile, O_RDWR|O_CREAT|O_EXCL, 0644);
123 
124 		if (fd < 0) {
125 			(void) fprintf(stderr,
126 			    gettext("Error trying to open file.\n"));
127 			return (1);
128 		}
129 
130 		lseek(fd, 0, SEEK_END);
131 
132 		if ((fp2 = fdopen(fd, "a")) != NULL) {
133 			while ((cp = _file_getline(fp)) != NULL) {
134 				(void) fprintf(fp2, "%s", cp);
135 			}
136 			return (0);
137 		} else {
138 			(void) fprintf(stderr,
139 			    gettext("Error trying to open file.\n"));
140 			return (1);
141 		}
142 	} else {
143 		(void) fprintf(stderr,
144 		    gettext("Error trying to open file.\n"));
145 		return (1);
146 	}
147 }
148