1 1.12 xtraeme /* $NetBSD: util.c,v 1.12 2005/02/17 17:09:48 xtraeme Exp $ */ 2 1.4 glass 3 1.1 cgd /*- 4 1.4 glass * Copyright (c) 1988, 1993, 1994 5 1.4 glass * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.11 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.7 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.4 glass #if 0 35 1.4 glass static char sccsid[] = "@(#)util.c 8.4 (Berkeley) 4/2/94"; 36 1.4 glass #else 37 1.12 xtraeme __RCSID("$NetBSD: util.c,v 1.12 2005/02/17 17:09:48 xtraeme Exp $"); 38 1.4 glass #endif 39 1.1 cgd #endif /* not lint */ 40 1.1 cgd 41 1.1 cgd #include <sys/types.h> 42 1.4 glass 43 1.4 glass #include <ctype.h> 44 1.1 cgd #include <pwd.h> 45 1.1 cgd #include <stdio.h> 46 1.4 glass #include <stdlib.h> 47 1.1 cgd #include <string.h> 48 1.4 glass #include <time.h> 49 1.4 glass #include <tzfile.h> 50 1.4 glass #include <unistd.h> 51 1.4 glass 52 1.1 cgd #include "chpass.h" 53 1.1 cgd #include "pathnames.h" 54 1.1 cgd 55 1.1 cgd char * 56 1.12 xtraeme ttoa(char *buf, size_t len, time_t tval) 57 1.1 cgd { 58 1.1 cgd 59 1.1 cgd if (tval) { 60 1.8 christos struct tm *tp = localtime(&tval); 61 1.8 christos 62 1.8 christos (void) strftime(buf, len, "%B %d, %Y", tp); 63 1.8 christos buf[len - 1] = '\0'; 64 1.1 cgd } 65 1.8 christos else if (len > 0) 66 1.8 christos *buf = '\0'; 67 1.8 christos return (buf); 68 1.1 cgd } 69 1.1 cgd 70 1.4 glass int 71 1.12 xtraeme atot(const char *p, time_t *store) 72 1.1 cgd { 73 1.1 cgd static struct tm *lt; 74 1.8 christos struct tm tm; 75 1.8 christos char *t; 76 1.4 glass time_t tval; 77 1.1 cgd 78 1.1 cgd if (!*p) { 79 1.1 cgd *store = 0; 80 1.4 glass return (0); 81 1.1 cgd } 82 1.1 cgd if (!lt) { 83 1.1 cgd unsetenv("TZ"); 84 1.1 cgd (void)time(&tval); 85 1.1 cgd lt = localtime(&tval); 86 1.1 cgd } 87 1.8 christos (void) memset(&tm, 0, sizeof(tm)); 88 1.8 christos while ((t = strchr(p, ',')) != NULL) 89 1.8 christos *t = ' '; 90 1.8 christos t = strptime(p, "%B %d %Y", &tm); 91 1.8 christos if (t == NULL || (*t != '\0' && *t != '\n')) 92 1.8 christos return 1; 93 1.8 christos if ((*store = mktime(&tm)) == (time_t) -1) 94 1.8 christos return 1; 95 1.4 glass return (0); 96 1.1 cgd } 97 1.1 cgd 98 1.10 mycroft const char * 99 1.12 xtraeme ok_shell(const char *name) 100 1.1 cgd { 101 1.9 mycroft char *p; 102 1.9 mycroft const char *sh; 103 1.1 cgd 104 1.1 cgd setusershell(); 105 1.6 mikel while ((sh = getusershell()) != NULL) { 106 1.1 cgd if (!strcmp(name, sh)) 107 1.4 glass return (name); 108 1.1 cgd /* allow just shell name, but use "real" path */ 109 1.4 glass if ((p = strrchr(sh, '/')) && strcmp(name, p + 1) == 0) 110 1.4 glass return (sh); 111 1.1 cgd } 112 1.4 glass return (NULL); 113 1.1 cgd } 114