1 /* $OpenBSD: login_reject.c,v 1.3 2001/12/06 05:37:04 millert Exp $ */ 2 3 /*- 4 * Copyright (c) 1995 Berkeley Software Design, Inc. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. All advertising materials mentioning features or use of this software 15 * must display the following acknowledgement: 16 * This product includes software developed by Berkeley Software Design, 17 * Inc. 18 * 4. The name of Berkeley Software Design, Inc. may not be used to endorse 19 * or promote products derived from this software without specific prior 20 * written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY BERKELEY SOFTWARE DESIGN, INC. ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL BERKELEY SOFTWARE DESIGN, INC. BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * BSDI $From: login_reject.c,v 1.5 1996/08/22 20:43:11 prb Exp $ 35 */ 36 #include <sys/param.h> 37 #include <sys/stat.h> 38 #include <sys/time.h> 39 #include <sys/resource.h> 40 #include <sys/file.h> 41 #include <sys/wait.h> 42 43 #include <err.h> 44 #include <errno.h> 45 #include <login_cap.h> 46 #include <pwd.h> 47 #include <signal.h> 48 #include <stdarg.h> 49 #include <stdio.h> 50 #include <stdlib.h> 51 #include <string.h> 52 #include <syslog.h> 53 #include <unistd.h> 54 55 int 56 main(argc, argv) 57 int argc; 58 char *argv[]; 59 { 60 FILE *back; 61 char passbuf[1]; 62 int c; 63 struct rlimit rl; 64 int mode = 0; 65 66 rl.rlim_cur = 0; 67 rl.rlim_max = 0; 68 (void)setrlimit(RLIMIT_CORE, &rl); 69 70 (void)setpriority(PRIO_PROCESS, 0, 0); 71 72 openlog("login", LOG_ODELAY, LOG_AUTH); 73 74 while ((c = getopt(argc, argv, "v:s:")) != -1) 75 switch(c) { 76 case 'v': 77 break; 78 case 's': /* service */ 79 if (strcmp(optarg, "login") == 0) 80 mode = 0; 81 else if (strcmp(optarg, "challenge") == 0) 82 mode = 1; 83 else if (strcmp(optarg, "response") == 0) 84 mode = 2; 85 else { 86 syslog(LOG_ERR, "%s: invalid service", optarg); 87 exit(1); 88 } 89 break; 90 default: 91 syslog(LOG_ERR, "usage error"); 92 exit(1); 93 } 94 95 switch(argc - optind) { 96 case 2: 97 case 1: 98 break; 99 default: 100 syslog(LOG_ERR, "usage error"); 101 exit(1); 102 } 103 104 if (!(back = fdopen(3, "r+"))) { 105 syslog(LOG_ERR, "reopening back channel: %m"); 106 exit(1); 107 } 108 if (mode == 1) { 109 fprintf(back, BI_SILENT "\n"); 110 exit(0); 111 } 112 113 if (mode == 2) { 114 mode = 0; 115 c = -1; 116 while (read(3, passbuf, 1) == 1) { 117 if (passbuf[0] == '\0' && ++mode == 2) 118 break; 119 } 120 if (mode < 2) { 121 syslog(LOG_ERR, "protocol error on back channel"); 122 exit(1); 123 } 124 } else 125 getpass("Password:"); 126 127 128 crypt("password", "xx"); 129 fprintf(back, BI_REJECT "\n"); 130 exit(1); 131 } 132