1/* 2 * Copyright (c) 1999-2000 Damien Miller. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24 25#include "includes.h" 26 27RCSID("$Id: bsd-misc.c,v 1.10 2002/07/08 21:09:41 mouring Exp $"); 28 29#pragma ident "%Z%%M% %I% %E% SMI" 30 31char *get_progname(char *argv0) 32{ 33#ifdef HAVE___PROGNAME 34 extern char *__progname; 35 36 return __progname; 37#else 38 char *p; 39 40 if (argv0 == NULL) 41 return "unknown"; /* XXX */ 42 p = strrchr(argv0, '/'); 43 if (p == NULL) 44 p = argv0; 45 else 46 p++; 47 return p; 48#endif 49} 50 51#ifndef HAVE_SETLOGIN 52int setlogin(const char *name) 53{ 54 return(0); 55} 56#endif /* !HAVE_SETLOGIN */ 57 58#ifndef HAVE_INNETGR 59int innetgr(const char *netgroup, const char *host, 60 const char *user, const char *domain) 61{ 62 return(0); 63} 64#endif /* HAVE_INNETGR */ 65 66#if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) 67int seteuid(uid_t euid) 68{ 69 return(setreuid(-1,euid)); 70} 71#endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */ 72 73#if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) 74int setegid(uid_t egid) 75{ 76 return(setresgid(-1,egid,-1)); 77} 78#endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */ 79 80#if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR) 81const char *strerror(int e) 82{ 83 extern int sys_nerr; 84 extern char *sys_errlist[]; 85 86 if ((e >= 0) && (e < sys_nerr)) 87 return(sys_errlist[e]); 88 else 89 return("unlisted error"); 90} 91#endif 92 93#ifndef HAVE_UTIMES 94int utimes(char *filename, struct timeval *tvp) 95{ 96 struct utimbuf ub; 97 98 ub.actime = tvp[0].tv_sec; 99 ub.modtime = tvp[1].tv_sec; 100 101 return(utime(filename, &ub)); 102} 103#endif 104 105#ifndef HAVE_TRUNCATE 106int truncate (const char *path, off_t length) 107{ 108 int fd, ret, saverrno; 109 110 fd = open(path, O_WRONLY); 111 if (fd < 0) 112 return -1; 113 114 ret = ftruncate(fd, length); 115 saverrno = errno; 116 (void) close (fd); 117 if (ret == -1) 118 errno = saverrno; 119 return(ret); 120} 121#endif /* HAVE_TRUNCATE */ 122 123#if !defined(HAVE_SETGROUPS) && defined(SETGROUPS_NOOP) 124/* 125 * Cygwin setgroups should be a noop. 126 */ 127int 128setgroups(size_t size, const gid_t *list) 129{ 130 return 0; 131} 132#endif 133 134