GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/at/../../usr.sbin/cron/client.c Lines: 0 38 0.0 %
Date: 2017-11-07 Branches: 0 32 0.0 %

Line Branch Exec Source
1
/*	$OpenBSD: client.c,v 1.8 2015/11/12 21:12:05 millert Exp $	*/
2
3
/* Copyright 1988,1990,1993,1994 by Paul Vixie
4
 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
5
 * Copyright (c) 1997,2000 by Internet Software Consortium, Inc.
6
 *
7
 * Permission to use, copy, modify, and distribute this software for any
8
 * purpose with or without fee is hereby granted, provided that the above
9
 * copyright notice and this permission notice appear in all copies.
10
 *
11
 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
12
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13
 * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
14
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17
 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18
 */
19
20
#include <sys/types.h>
21
#include <sys/socket.h>
22
#include <sys/stat.h>
23
#include <sys/un.h>
24
25
#include <bitstring.h>		/* for structs.h */
26
#include <err.h>
27
#include <errno.h>
28
#include <stdio.h>
29
#include <stdlib.h>
30
#include <string.h>
31
#include <time.h>		/* for structs.h */
32
#include <unistd.h>
33
34
#include "pathnames.h"
35
#include "macros.h"
36
#include "structs.h"
37
#include "funcs.h"
38
#include "globals.h"
39
40
/* int in_file(const char *string, FILE *file, int error)
41
 *	return TRUE if one of the lines in file matches string exactly,
42
 *	FALSE if no lines match, and error on error.
43
 */
44
static int
45
in_file(const char *string, FILE *file, int error)
46
{
47
	char line[MAX_TEMPSTR];
48
	char *endp;
49
50
	if (fseek(file, 0L, SEEK_SET))
51
		return (error);
52
	while (fgets(line, MAX_TEMPSTR, file)) {
53
		if (line[0] != '\0') {
54
			endp = &line[strlen(line) - 1];
55
			if (*endp != '\n')
56
				return (error);
57
			*endp = '\0';
58
			if (0 == strcmp(line, string))
59
				return (TRUE);
60
		}
61
	}
62
	if (ferror(file))
63
		return (error);
64
	return (FALSE);
65
}
66
67
/* int allowed(const char *username, const char *allow_file, const char *deny_file)
68
 *	returns TRUE if (allow_file exists and user is listed)
69
 *	or (deny_file exists and user is NOT listed).
70
 *	root is always allowed.
71
 */
72
int
73
allowed(const char *username, const char *allow_file, const char *deny_file)
74
{
75
	FILE	*fp;
76
	int	isallowed;
77
78
	if (strcmp(username, "root") == 0)
79
		return (TRUE);
80
	isallowed = FALSE;
81
	if ((fp = fopen(allow_file, "r")) != NULL) {
82
		isallowed = in_file(username, fp, FALSE);
83
		fclose(fp);
84
	} else if ((fp = fopen(deny_file, "r")) != NULL) {
85
		isallowed = !in_file(username, fp, FALSE);
86
		fclose(fp);
87
	}
88
	return (isallowed);
89
}
90
91
/* void poke_daemon(unsigned char cookie)
92
 *	touches spool_dir and sends a poke to the cron daemon if running.
93
 */
94
void
95
poke_daemon(unsigned char cookie)
96
{
97
	int sock = -1;
98
	const char *cronsock = _PATH_CRON_SOCK;
99
	struct stat sb;
100
	struct sockaddr_un s_un;
101
102
	if (stat(cronsock, &sb) != 0)
103
		cronsock = _PATH_CRON_SOCK_OLD;	/* backwards compatibility */
104
105
	bzero(&s_un, sizeof(s_un));
106
	if (strlcpy(s_un.sun_path, cronsock, sizeof(s_un.sun_path)) >=
107
	    sizeof(s_un.sun_path)) {
108
		warnc(ENAMETOOLONG, "%s", cronsock);
109
		return;
110
	}
111
	s_un.sun_family = AF_UNIX;
112
	if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) >= 0 &&
113
	    connect(sock, (struct sockaddr *)&s_un, sizeof(s_un)) == 0)
114
		send(sock, &cookie, 1, MSG_NOSIGNAL);
115
	else
116
		warnx("warning, cron does not appear to be running");
117
	if (sock >= 0)
118
		close(sock);
119
}