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 char *get_progname(char *argv0) 30 { 31 #ifdef HAVE___PROGNAME 32 extern char *__progname; 33 34 return __progname; 35 #else 36 char *p; 37 38 if (argv0 == NULL) 39 return "unknown"; /* XXX */ 40 p = strrchr(argv0, '/'); 41 if (p == NULL) 42 p = argv0; 43 else 44 p++; 45 return p; 46 #endif 47 } 48 49 #ifndef HAVE_SETLOGIN 50 int setlogin(const char *name) 51 { 52 return(0); 53 } 54 #endif /* !HAVE_SETLOGIN */ 55 56 #ifndef HAVE_INNETGR 57 int innetgr(const char *netgroup, const char *host, 58 const char *user, const char *domain) 59 { 60 return(0); 61 } 62 #endif /* HAVE_INNETGR */ 63 64 #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) 65 int seteuid(uid_t euid) 66 { 67 return(setreuid(-1,euid)); 68 } 69 #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */ 70 71 #if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) 72 int setegid(uid_t egid) 73 { 74 return(setresgid(-1,egid,-1)); 75 } 76 #endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */ 77 78 #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR) 79 const char *strerror(int e) 80 { 81 extern int sys_nerr; 82 extern char *sys_errlist[]; 83 84 if ((e >= 0) && (e < sys_nerr)) 85 return(sys_errlist[e]); 86 else 87 return("unlisted error"); 88 } 89 #endif 90 91 #ifndef HAVE_UTIMES 92 int utimes(char *filename, struct timeval *tvp) 93 { 94 struct utimbuf ub; 95 96 ub.actime = tvp[0].tv_sec; 97 ub.modtime = tvp[1].tv_sec; 98 99 return(utime(filename, &ub)); 100 } 101 #endif 102 103 #ifndef HAVE_TRUNCATE 104 int truncate (const char *path, off_t length) 105 { 106 int fd, ret, saverrno; 107 108 fd = open(path, O_WRONLY); 109 if (fd < 0) 110 return -1; 111 112 ret = ftruncate(fd, length); 113 saverrno = errno; 114 (void) close (fd); 115 if (ret == -1) 116 errno = saverrno; 117 return(ret); 118 } 119 #endif /* HAVE_TRUNCATE */ 120 121 #if !defined(HAVE_SETGROUPS) && defined(SETGROUPS_NOOP) 122 /* 123 * Cygwin setgroups should be a noop. 124 */ 125 int 126 setgroups(size_t size, const gid_t *list) 127 { 128 return 0; 129 } 130 #endif 131 132