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 27 RCSID("$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 31 char *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 52 int setlogin(const char *name) 53 { 54 return(0); 55 } 56 #endif /* !HAVE_SETLOGIN */ 57 58 #ifndef HAVE_INNETGR 59 int 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) 67 int 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) 74 int 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) 81 const 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 94 int 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 106 int 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 */ 127 int 128 setgroups(size_t size, const gid_t *list) 129 { 130 return 0; 131 } 132 #endif 133 134