perm.c revision 87208
1/* 2 * perm.c - check user permission for at(1) 3 * Copyright (C) 1994 Thomas Koenig 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. The name of the author(s) may not be used to endorse or promote 11 * products derived from this software without specific prior written 12 * permission. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17 * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21 * THEORY OF LIABILITY, WETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef lint 27static const char rcsid[] = 28 "$FreeBSD: head/usr.bin/at/perm.c 87208 2001-12-02 12:26:18Z markm $"; 29#endif /* not lint */ 30 31/* System Headers */ 32 33#include <sys/types.h> 34#include <err.h> 35#include <errno.h> 36#include <pwd.h> 37#include <stddef.h> 38#include <stdio.h> 39#include <stdlib.h> 40#include <string.h> 41#include <unistd.h> 42 43/* Local headers */ 44 45#include "at.h" 46#include "perm.h" 47#include "privs.h" 48 49/* Macros */ 50 51#define MAXUSERID 10 52 53/* Structures and unions */ 54 55/* Function declarations */ 56 57static int check_for_user(FILE *fp,const char *name); 58 59/* Local functions */ 60 61static int check_for_user(FILE *fp,const char *name) 62{ 63 char *buffer; 64 size_t len; 65 int found = 0; 66 67 len = strlen(name); 68 if ((buffer = malloc(len+2)) == NULL) 69 errx(EXIT_FAILURE, "virtual memory exhausted"); 70 71 while(fgets(buffer, len+2, fp) != NULL) 72 { 73 if ((strncmp(name, buffer, len) == 0) && 74 (buffer[len] == '\n')) 75 { 76 found = 1; 77 break; 78 } 79 } 80 fclose(fp); 81 free(buffer); 82 return found; 83} 84/* Global functions */ 85int check_permission(void) 86{ 87 FILE *fp; 88 uid_t uid = geteuid(); 89 struct passwd *pentry; 90 91 if (uid==0) 92 return 1; 93 94 if ((pentry = getpwuid(uid)) == NULL) 95 err(EXIT_FAILURE, "cannot access user database"); 96 97 PRIV_START 98 99 fp=fopen(PERM_PATH "at.allow","r"); 100 101 PRIV_END 102 103 if (fp != NULL) 104 { 105 return check_for_user(fp, pentry->pw_name); 106 } 107 else if (errno == ENOENT) 108 { 109 110 PRIV_START 111 112 fp=fopen(PERM_PATH "at.deny", "r"); 113 114 PRIV_END 115 116 if (fp != NULL) 117 { 118 return !check_for_user(fp, pentry->pw_name); 119 } 120 else if (errno != ENOENT) 121 warn("at.deny"); 122 } 123 else 124 warn("at.allow"); 125 return 0; 126} 127