]> andersk Git - openssh.git/blobdiff - openbsd-compat/bsd-misc.c
- djm@cvs.openbsd.org 2003/06/12 12:22:47
[openssh.git] / openbsd-compat / bsd-misc.c
index 29889344084072a1f064c8186bc4d049e7097aa1..6b254117f60c030b176ca2c7a475b49ee319bccd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1999-2000 Damien Miller.  All rights reserved.
+ * Copyright (c) 1999-2003 Damien Miller.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 
 #include "includes.h"
 #include "xmalloc.h"
-#include "ssh.h"
 
 RCSID("$Id$");
 
+/*
+ * NB. duplicate __progname in case it is an alias for argv[0]
+ * Otherwise it may get clobbered by setproctitle()
+ */
 char *get_progname(char *argv0)
 {
 #ifdef HAVE___PROGNAME
        extern char *__progname;
 
-       return __progname;
+       return xstrdup(__progname);
 #else
        char *p;
 
        if (argv0 == NULL)
-               return "unknown";       /* XXX */
+               return ("unknown");     /* XXX */
        p = strrchr(argv0, '/');
        if (p == NULL)
                p = argv0;
        else
                p++;
-       return p;
+
+       return (xstrdup(p));
 #endif
 }
 
 #ifndef HAVE_SETLOGIN
 int setlogin(const char *name)
 {
-       return(0);
+       return (0);
 }
 #endif /* !HAVE_SETLOGIN */
 
@@ -59,17 +63,24 @@ int setlogin(const char *name)
 int innetgr(const char *netgroup, const char *host, 
             const char *user, const char *domain)
 {
-       return(0);
+       return (0);
 }
 #endif /* HAVE_INNETGR */
 
 #if !defined(HAVE_SETEUID) && defined(HAVE_SETREUID)
 int seteuid(uid_t euid)
 {
-       return(setreuid(-1,euid));
+       return (setreuid(-1, euid));
 }
 #endif /* !defined(HAVE_SETEUID) && defined(HAVE_SETREUID) */
 
+#if !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID)
+int setegid(uid_t egid)
+{
+       return(setresgid(-1, egid, -1));
+}
+#endif /* !defined(HAVE_SETEGID) && defined(HAVE_SETRESGID) */
+
 #if !defined(HAVE_STRERROR) && defined(HAVE_SYS_ERRLIST) && defined(HAVE_SYS_NERR)
 const char *strerror(int e)
 {
@@ -77,9 +88,9 @@ const char *strerror(int e)
        extern char *sys_errlist[];
        
        if ((e >= 0) && (e < sys_nerr))
-               return(sys_errlist[e]);
-       else
-               return("unlisted error");
+               return (sys_errlist[e]);
+
+       return ("unlisted error");
 }
 #endif
 
@@ -88,9 +99,71 @@ int utimes(char *filename, struct timeval *tvp)
 {
        struct utimbuf ub;
 
-       ub.actime = tvp->tv_sec;
-       ub.modtime = tvp->tv_usec;
+       ub.actime = tvp[0].tv_sec;
+       ub.modtime = tvp[1].tv_sec;
        
-       return(utime(filename, &ub));
+       return (utime(filename, &ub));
+}
+#endif 
+
+#ifndef HAVE_TRUNCATE
+int truncate(const char *path, off_t length)
+{
+       int fd, ret, saverrno;
+
+       fd = open(path, O_WRONLY);
+       if (fd < 0)
+               return (-1);
+
+       ret = ftruncate(fd, length);
+       saverrno = errno;
+       close(fd);
+       if (ret == -1)
+               errno = saverrno;
+
+       return(ret);
+}
+#endif /* HAVE_TRUNCATE */
+
+#if !defined(HAVE_SETGROUPS) && defined(SETGROUPS_NOOP)
+/*
+ * Cygwin setgroups should be a noop.
+ */
+int
+setgroups(size_t size, const gid_t *list)
+{
+       return (0);
 }
 #endif 
+
+#if !defined(HAVE_NANOSLEEP) && !defined(HAVE_NSLEEP)
+int nanosleep(const struct timespec *req, struct timespec *rem)
+{
+       int rc, saverrno;
+       extern int errno;
+       struct timeval tstart, tstop, tremain, time2wait;
+
+       TIMESPEC_TO_TIMEVAL(&time2wait, req)
+       (void) gettimeofday(&tstart, NULL);
+       rc = select(0, NULL, NULL, NULL, &time2wait);
+       if (rc == -1) {
+               saverrno = errno;
+               (void) gettimeofday (&tstop, NULL);
+               errno = saverrno;
+               tremain.tv_sec = time2wait.tv_sec - 
+                       (tstop.tv_sec - tstart.tv_sec);
+               tremain.tv_usec = time2wait.tv_usec - 
+                       (tstop.tv_usec - tstart.tv_usec);
+               tremain.tv_sec += tremain.tv_usec / 1000000L;
+               tremain.tv_usec %= 1000000L;
+       } else {
+               tremain.tv_sec = 0;
+               tremain.tv_usec = 0;
+       }
+       TIMEVAL_TO_TIMESPEC(&tremain, rem)
+
+       return(rc);
+}
+
+#endif
+
This page took 0.076737 seconds and 4 git commands to generate.