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