]> andersk Git - openssh.git/blobdiff - misc.c
- (djm) Bug #406: s/msg_send/ssh_msg_send/ for Mac OS X 1.2
[openssh.git] / misc.c
diff --git a/misc.c b/misc.c
index b0fdbe03cb77fb672e0fb2e7bbda17d49dfca205..e9fcef6ca3018c88a1d7fd9e776df351b769c3ff 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -1,5 +1,3 @@
-/*     $OpenBSD: misc.c,v 1.8 2001/05/11 14:59:56 markus Exp $ */
-
 /*
  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
  *
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: misc.c,v 1.8 2001/05/11 14:59:56 markus Exp $");
+RCSID("$OpenBSD: misc.c,v 1.19 2002/03/04 17:27:39 stevesk Exp $");
 
 #include "misc.h"
 #include "log.h"
 #include "xmalloc.h"
 
+/* remove newline at end of string */
 char *
 chop(char *s)
 {
        char *t = s;
        while (*t) {
-               if(*t == '\n' || *t == '\r') {
+               if (*t == '\n' || *t == '\r') {
                        *t = '\0';
                        return s;
                }
@@ -46,6 +45,7 @@ chop(char *s)
 
 }
 
+/* set/unset filedescriptor to non-blocking */
 void
 set_nonblock(int fd)
 {
@@ -63,9 +63,8 @@ set_nonblock(int fd)
        debug("fd %d setting O_NONBLOCK", fd);
        val |= O_NONBLOCK;
        if (fcntl(fd, F_SETFL, val) == -1)
-               if (errno != ENODEV)
-                       error("fcntl(%d, F_SETFL, O_NONBLOCK): %s",
-                           fd, strerror(errno));
+               debug("fcntl(%d, F_SETFL, O_NONBLOCK): %s",
+                   fd, strerror(errno));
 }
 
 void
@@ -82,17 +81,39 @@ unset_nonblock(int fd)
                debug2("fd %d is not O_NONBLOCK", fd);
                return;
        }
-       debug("fd %d setting O_NONBLOCK", fd);
+       debug("fd %d clearing O_NONBLOCK", fd);
        val &= ~O_NONBLOCK;
        if (fcntl(fd, F_SETFL, val) == -1)
-               if (errno != ENODEV)
-                       error("fcntl(%d, F_SETFL, O_NONBLOCK): %s",
-                           fd, strerror(errno));
+               debug("fcntl(%d, F_SETFL, O_NONBLOCK): %s",
+                   fd, strerror(errno));
+}
+
+/* disable nagle on socket */
+void
+set_nodelay(int fd)
+{
+       int opt;
+       socklen_t optlen;
+
+       optlen = sizeof opt;
+       if (getsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &opt, &optlen) == -1) {
+               error("getsockopt TCP_NODELAY: %.100s", strerror(errno));
+               return;
+       }
+       if (opt == 1) {
+               debug2("fd %d is TCP_NODELAY", fd);
+               return;
+       }
+       opt = 1;
+       debug("fd %d setting TCP_NODELAY", fd);
+       if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &opt, sizeof opt) == -1)
+               error("setsockopt TCP_NODELAY: %.100s", strerror(errno));
 }
 
 /* Characters considered whitespace in strsep calls. */
 #define WHITESPACE " \t\r\n"
 
+/* return next token in configuration line */
 char *
 strdelim(char **s)
 {
@@ -131,6 +152,12 @@ pwcopy(struct passwd *pw)
        copy->pw_gecos = xstrdup(pw->pw_gecos);
        copy->pw_uid = pw->pw_uid;
        copy->pw_gid = pw->pw_gid;
+#ifdef HAVE_PW_EXPIRE_IN_PASSWD
+       copy->pw_expire = pw->pw_expire;
+#endif
+#ifdef HAVE_PW_CHANGE_IN_PASSWD
+       copy->pw_change = pw->pw_change;
+#endif
 #ifdef HAVE_PW_CLASS_IN_PASSWD
        copy->pw_class = xstrdup(pw->pw_class);
 #endif
@@ -139,7 +166,13 @@ pwcopy(struct passwd *pw)
        return copy;
 }
 
-int a2port(const char *s)
+/*
+ * Convert ASCII string to TCP/IP port number.
+ * Port must be >0 and <=65535.
+ * Return 0 if invalid.
+ */
+int
+a2port(const char *s)
 {
        long port;
        char *endp;
@@ -154,6 +187,88 @@ int a2port(const char *s)
        return port;
 }
 
+#define SECONDS                1
+#define MINUTES                (SECONDS * 60)
+#define HOURS          (MINUTES * 60)
+#define DAYS           (HOURS * 24)
+#define WEEKS          (DAYS * 7)
+
+/*
+ * Convert a time string into seconds; format is
+ * a sequence of:
+ *      time[qualifier]
+ *
+ * Valid time qualifiers are:
+ *      <none>  seconds
+ *      s|S     seconds
+ *      m|M     minutes
+ *      h|H     hours
+ *      d|D     days
+ *      w|W     weeks
+ *
+ * Examples:
+ *      90m     90 minutes
+ *      1h30m   90 minutes
+ *      2d      2 days
+ *      1w      1 week
+ *
+ * Return -1 if time string is invalid.
+ */
+long
+convtime(const char *s)
+{
+       long total, secs;
+       const char *p;
+       char *endp;
+
+       errno = 0;
+       total = 0;
+       p = s;
+
+       if (p == NULL || *p == '\0')
+               return -1;
+
+       while (*p) {
+               secs = strtol(p, &endp, 10);
+               if (p == endp ||
+                   (errno == ERANGE && (secs == LONG_MIN || secs == LONG_MAX)) ||
+                   secs < 0)
+                       return -1;
+
+               switch (*endp++) {
+               case '\0':
+                       endp--;
+               case 's':
+               case 'S':
+                       break;
+               case 'm':
+               case 'M':
+                       secs *= MINUTES;
+                       break;
+               case 'h':
+               case 'H':
+                       secs *= HOURS;
+                       break;
+               case 'd':
+               case 'D':
+                       secs *= DAYS;
+                       break;
+               case 'w':
+               case 'W':
+                       secs *= WEEKS;
+                       break;
+               default:
+                       return -1;
+               }
+               total += secs;
+               if (total < 0)
+                       return -1;
+               p = endp;
+       }
+
+       return total;
+}
+
 char *
 cleanhostname(char *host)
 {
@@ -187,6 +302,7 @@ colon(char *cp)
        return (0);
 }
 
+/* function to assist building execv() arguments */
 void
 addargs(arglist *args, char *fmt, ...)
 {
@@ -200,7 +316,7 @@ addargs(arglist *args, char *fmt, ...)
        if (args->list == NULL) {
                args->nalloc = 32;
                args->num = 0;
-       } else if (args->num+2 >= args->nalloc) 
+       } else if (args->num+2 >= args->nalloc)
                args->nalloc *= 2;
 
        args->list = xrealloc(args->list, args->nalloc * sizeof(char *));
@@ -220,10 +336,6 @@ mysignal(int sig, mysig_t act)
                memset(&sa, 0, sizeof(sa));
                sigemptyset(&sa.sa_mask);
                sa.sa_flags = 0;
-#if defined(SA_RESTART)
-               if (sig == SIGCHLD)
-                       sa.sa_flags |= SA_RESTART;
-#endif
 #if defined(SA_INTERRUPT)
                if (sig == SIGALRM)
                        sa.sa_flags |= SA_INTERRUPT;
This page took 0.045168 seconds and 4 git commands to generate.