1 /* $OpenBSD: misc.c,v 1.5 2001/04/12 20:09:37 stevesk Exp $ */ 2 3 /* 4 * Copyright (c) 2000 Markus Friedl. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 #include "includes.h" 28 RCSID("$OpenBSD: misc.c,v 1.5 2001/04/12 20:09:37 stevesk Exp $"); 29 30 #include "misc.h" 31 #include "log.h" 32 #include "xmalloc.h" 33 34 char * 35 chop(char *s) 36 { 37 char *t = s; 38 while (*t) { 39 if(*t == '\n' || *t == '\r') { 40 *t = '\0'; 41 return s; 42 } 43 t++; 44 } 45 return s; 46 47 } 48 49 void 50 set_nonblock(int fd) 51 { 52 int val; 53 val = fcntl(fd, F_GETFL, 0); 54 if (val < 0) { 55 error("fcntl(%d, F_GETFL, 0): %s", fd, strerror(errno)); 56 return; 57 } 58 if (val & O_NONBLOCK) { 59 debug("fd %d IS O_NONBLOCK", fd); 60 return; 61 } 62 debug("fd %d setting O_NONBLOCK", fd); 63 val |= O_NONBLOCK; 64 if (fcntl(fd, F_SETFL, val) == -1) 65 if (errno != ENODEV) 66 error("fcntl(%d, F_SETFL, O_NONBLOCK): %s", 67 fd, strerror(errno)); 68 } 69 70 /* Characters considered whitespace in strsep calls. */ 71 #define WHITESPACE " \t\r\n" 72 73 char * 74 strdelim(char **s) 75 { 76 char *old; 77 int wspace = 0; 78 79 if (*s == NULL) 80 return NULL; 81 82 old = *s; 83 84 *s = strpbrk(*s, WHITESPACE "="); 85 if (*s == NULL) 86 return (old); 87 88 /* Allow only one '=' to be skipped */ 89 if (*s[0] == '=') 90 wspace = 1; 91 *s[0] = '\0'; 92 93 *s += strspn(*s + 1, WHITESPACE) + 1; 94 if (*s[0] == '=' && !wspace) 95 *s += strspn(*s + 1, WHITESPACE) + 1; 96 97 return (old); 98 } 99 100 struct passwd * 101 pwcopy(struct passwd *pw) 102 { 103 struct passwd *copy = xmalloc(sizeof(*copy)); 104 105 memset(copy, 0, sizeof(*copy)); 106 copy->pw_name = xstrdup(pw->pw_name); 107 copy->pw_passwd = xstrdup(pw->pw_passwd); 108 copy->pw_gecos = xstrdup(pw->pw_gecos); 109 copy->pw_uid = pw->pw_uid; 110 copy->pw_gid = pw->pw_gid; 111 copy->pw_class = xstrdup(pw->pw_class); 112 copy->pw_dir = xstrdup(pw->pw_dir); 113 copy->pw_shell = xstrdup(pw->pw_shell); 114 return copy; 115 } 116 117 int a2port(const char *s) 118 { 119 long port; 120 char *endp; 121 122 errno = 0; 123 port = strtol(s, &endp, 0); 124 if (s == endp || *endp != '\0' || 125 (errno == ERANGE && (port == LONG_MIN || port == LONG_MAX)) || 126 port <= 0 || port > 65535) 127 return 0; 128 129 return port; 130 } 131