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 #include "xmalloc.h" 27 28 RCSID("$Id: bsd-misc.c,v 1.12 2003/03/18 18:21:41 tim Exp $"); 29 30 /* 31 * NB. duplicate __progname in case it is an alias for argv[0] 32 * Otherwise it may get clobbered by setproctitle() 33 */ 34 char *get_progname(char *argv0) 35 { 36 #ifdef HAVE___PROGNAME 37 extern char *__progname; 38 39 return xstrdup(__progname); 40 #else 41 char *p; 42 43 if (argv0 == NULL) 44 return "unknown"; /* XXX */ 45 p = strrchr(argv0, '/'); 46 if (p == NULL) 47 p = argv0; 48 else 49 p++; 50 51 return xstrdup(p); 52 #endif 53 } 54 55 #ifndef HAVE_SETLOGIN 56 int setlogin(const char *name) 57 { 58 return(0); 59 } 60 #endif /* !HAVE_SETLOGIN */ 61 62 #ifndef HAVE_INNETGR 63 int innetgr(const char *netgroup, const char *host, 64 const char *user, const char *domain) 65 { 66 return(0); 67 } 68 #endif /* HAVE_INNETGR */ 69 70 #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) 71 int seteuid(uid_t euid) 72 { 73 return(setreuid(-1,euid)); 74 } 75 #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */ 76 77 #if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) 78 int setegid(uid_t egid) 79 { 80 return(setresgid(-1,egid,-1)); 81 } 82 #endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */ 83 84 #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR) 85 const char *strerror(int e) 86 { 87 extern int sys_nerr; 88 extern char *sys_errlist[]; 89 90 if ((e >= 0) && (e < sys_nerr)) 91 return(sys_errlist[e]); 92 else 93 return("unlisted error"); 94 } 95 #endif 96 97 #ifndef HAVE_UTIMES 98 int utimes(char *filename, struct timeval *tvp) 99 { 100 struct utimbuf ub; 101 102 ub.actime = tvp[0].tv_sec; 103 ub.modtime = tvp[1].tv_sec; 104 105 return(utime(filename, &ub)); 106 } 107 #endif 108 109 #ifndef HAVE_TRUNCATE 110 int truncate (const char *path, off_t length) 111 { 112 int fd, ret, saverrno; 113 114 fd = open(path, O_WRONLY); 115 if (fd < 0) 116 return -1; 117 118 ret = ftruncate(fd, length); 119 saverrno = errno; 120 (void) close (fd); 121 if (ret == -1) 122 errno = saverrno; 123 return(ret); 124 } 125 #endif /* HAVE_TRUNCATE */ 126 127 #if !defined(HAVE_SETGROUPS) && defined(SETGROUPS_NOOP) 128 /* 129 * Cygwin setgroups should be a noop. 130 */ 131 int 132 setgroups(size_t size, const gid_t *list) 133 { 134 return 0; 135 } 136 #endif 137 138 #if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP) 139 int nanosleep(const struct timespec *req, struct timespec *rem) 140 { 141 int rc, saverrno; 142 extern int errno; 143 struct timeval tstart, tstop, tremain, time2wait; 144 145 TIMESPEC_TO_TIMEVAL(&time2wait, req) 146 (void) gettimeofday(&tstart, NULL); 147 rc = select(0, NULL, NULL, NULL, &time2wait); 148 if (rc == -1) { 149 saverrno = errno; 150 (void) gettimeofday (&tstop, NULL); 151 errno = saverrno; 152 tremain.tv_sec = time2wait.tv_sec - 153 (tstop.tv_sec - tstart.tv_sec); 154 tremain.tv_usec = time2wait.tv_usec - 155 (tstop.tv_usec - tstart.tv_usec); 156 tremain.tv_sec += tremain.tv_usec / 1000000L; 157 tremain.tv_usec %= 1000000L; 158 } else { 159 tremain.tv_sec = 0; 160 tremain.tv_usec = 0; 161 } 162 TIMEVAL_TO_TIMESPEC(&tremain, rem) 163 164 return(rc); 165 } 166 167 #endif 168 169