xref: /openbsd-src/usr.sbin/cron/misc.c (revision 39339e78fa3cf6f5639ec222befd248e06ea5b5c)
1*39339e78Sderaadt /*	$OpenBSD: misc.c,v 1.72 2022/05/21 01:21:29 deraadt Exp $	*/
2e134e629Smillert 
3df930be7Sderaadt /* Copyright 1988,1990,1993,1994 by Paul Vixie
4a5198fa1Smillert  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5f454ebdeSmillert  * Copyright (c) 1997,2000 by Internet Software Consortium, Inc.
6df930be7Sderaadt  *
7f454ebdeSmillert  * Permission to use, copy, modify, and distribute this software for any
8f454ebdeSmillert  * purpose with or without fee is hereby granted, provided that the above
9f454ebdeSmillert  * copyright notice and this permission notice appear in all copies.
10df930be7Sderaadt  *
11a5198fa1Smillert  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12a5198fa1Smillert  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13a5198fa1Smillert  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
14a5198fa1Smillert  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15a5198fa1Smillert  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16a5198fa1Smillert  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17a5198fa1Smillert  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18df930be7Sderaadt  */
19df930be7Sderaadt 
20fa575ea2Smillert #include <sys/types.h>
21fa575ea2Smillert #include <sys/wait.h>
22fa575ea2Smillert 
23fa575ea2Smillert #include <bitstring.h>		/* for structs.h */
24fa575ea2Smillert #include <stdio.h>
25fa575ea2Smillert #include <stdlib.h>
26fa575ea2Smillert #include <string.h>
27fa575ea2Smillert #include <time.h>		/* for structs.h */
28fa575ea2Smillert 
29fa575ea2Smillert #include "macros.h"
30fa575ea2Smillert #include "structs.h"
31fa575ea2Smillert #include "funcs.h"
32fa575ea2Smillert #include "globals.h"
33df930be7Sderaadt 
344a3a0dd4Smillert int LineNumber;
35d8a30772Smillert 
36df930be7Sderaadt /* get_char(file) : like getc() but increment LineNumber on newlines
37df930be7Sderaadt  */
38df930be7Sderaadt int
get_char(FILE * file)39785ecd14Stedu get_char(FILE *file)
40785ecd14Stedu {
41df930be7Sderaadt 	int ch;
42df930be7Sderaadt 
43df930be7Sderaadt 	ch = getc(file);
44df930be7Sderaadt 	if (ch == '\n')
45df930be7Sderaadt 		Set_LineNum(LineNumber + 1)
46f454ebdeSmillert 	return (ch);
47df930be7Sderaadt }
48df930be7Sderaadt 
49df930be7Sderaadt /* unget_char(ch, file) : like ungetc but do LineNumber processing
50df930be7Sderaadt  */
51df930be7Sderaadt void
unget_char(int ch,FILE * file)52785ecd14Stedu unget_char(int ch, FILE *file)
53785ecd14Stedu {
54df930be7Sderaadt 	ungetc(ch, file);
55df930be7Sderaadt 	if (ch == '\n')
56df930be7Sderaadt 		Set_LineNum(LineNumber - 1)
57df930be7Sderaadt }
58df930be7Sderaadt 
59df930be7Sderaadt /* get_string(str, max, file, termstr) : like fgets() but
60df930be7Sderaadt  *		(1) has terminator string which should include \n
61df930be7Sderaadt  *		(2) will always leave room for the null
62df930be7Sderaadt  *		(3) uses get_char() so LineNumber will be accurate
63df930be7Sderaadt  *		(4) returns EOF or terminating character, whichever
64df930be7Sderaadt  */
65df930be7Sderaadt int
get_string(char * string,int size,FILE * file,char * terms)66785ecd14Stedu get_string(char *string, int size, FILE *file, char *terms)
67785ecd14Stedu {
68df930be7Sderaadt 	int ch;
69df930be7Sderaadt 
70*39339e78Sderaadt 	while ((ch = get_char(file)) != EOF && !strchr(terms, ch)) {
71df930be7Sderaadt 		if (size > 1) {
724d4e2f5aStedu 			*string++ = ch;
73df930be7Sderaadt 			size--;
74df930be7Sderaadt 		}
75df930be7Sderaadt 	}
76df930be7Sderaadt 
77df930be7Sderaadt 	if (size > 0)
78df930be7Sderaadt 		*string = '\0';
79df930be7Sderaadt 
80f454ebdeSmillert 	return (ch);
81df930be7Sderaadt }
82df930be7Sderaadt 
83df930be7Sderaadt /* skip_comments(file) : read past comment (if any)
84df930be7Sderaadt  */
85df930be7Sderaadt void
skip_comments(FILE * file)86785ecd14Stedu skip_comments(FILE *file)
87785ecd14Stedu {
88df930be7Sderaadt 	int ch;
89df930be7Sderaadt 
90*39339e78Sderaadt 	while ((ch = get_char(file)) != EOF) {
91df930be7Sderaadt 		/* ch is now the first character of a line.
92df930be7Sderaadt 		 */
93df930be7Sderaadt 
94df930be7Sderaadt 		while (ch == ' ' || ch == '\t')
95df930be7Sderaadt 			ch = get_char(file);
96df930be7Sderaadt 
97df930be7Sderaadt 		if (ch == EOF)
98df930be7Sderaadt 			break;
99df930be7Sderaadt 
100df930be7Sderaadt 		/* ch is now the first non-blank character of a line.
101df930be7Sderaadt 		 */
102df930be7Sderaadt 
103df930be7Sderaadt 		if (ch != '\n' && ch != '#')
104df930be7Sderaadt 			break;
105df930be7Sderaadt 
106df930be7Sderaadt 		/* ch must be a newline or comment as first non-blank
107df930be7Sderaadt 		 * character on a line.
108df930be7Sderaadt 		 */
109df930be7Sderaadt 
110df930be7Sderaadt 		while (ch != '\n' && ch != EOF)
111df930be7Sderaadt 			ch = get_char(file);
112df930be7Sderaadt 
113df930be7Sderaadt 		/* ch is now the newline of a line which we're going to
114df930be7Sderaadt 		 * ignore.
115df930be7Sderaadt 		 */
116df930be7Sderaadt 	}
117df930be7Sderaadt 	if (ch != EOF)
118df930be7Sderaadt 		unget_char(ch, file);
119df930be7Sderaadt }
120df930be7Sderaadt 
121c95ed473Smillert /* char *first_word(char *s, char *t)
122c95ed473Smillert  *	return pointer to first word
123c95ed473Smillert  * parameters:
124c95ed473Smillert  *	s - string we want the first word of
125c95ed473Smillert  *	t - terminators, implicitly including \0
126c95ed473Smillert  * warnings:
127df930be7Sderaadt  *	(1) this routine is fairly slow
128df930be7Sderaadt  *	(2) it returns a pointer to static storage
129df930be7Sderaadt  */
130df930be7Sderaadt char *
first_word(char * s,char * t)131785ecd14Stedu first_word(char *s, char *t)
132785ecd14Stedu {
133df930be7Sderaadt 	static char retbuf[2][MAX_TEMPSTR + 1];	/* sure wish C had GC */
134df930be7Sderaadt 	static int retsel = 0;
135f454ebdeSmillert 	char *rb, *rp;
136df930be7Sderaadt 
137df930be7Sderaadt 	/* select a return buffer */
138df930be7Sderaadt 	retsel = 1-retsel;
139df930be7Sderaadt 	rb = &retbuf[retsel][0];
140df930be7Sderaadt 	rp = rb;
141df930be7Sderaadt 
142df930be7Sderaadt 	/* skip any leading terminators */
143df930be7Sderaadt 	while (*s && (NULL != strchr(t, *s))) {
144df930be7Sderaadt 		s++;
145df930be7Sderaadt 	}
146df930be7Sderaadt 
147df930be7Sderaadt 	/* copy until next terminator or full buffer */
148df930be7Sderaadt 	while (*s && (NULL == strchr(t, *s)) && (rp < &rb[MAX_TEMPSTR])) {
149df930be7Sderaadt 		*rp++ = *s++;
150df930be7Sderaadt 	}
151df930be7Sderaadt 
152df930be7Sderaadt 	/* finish the return-string and return it */
153df930be7Sderaadt 	*rp = '\0';
154f454ebdeSmillert 	return (rb);
155df930be7Sderaadt }
156