--- embedaddon/mpd/src/util.c 2012/02/21 23:32:47 1.1.1.1 +++ embedaddon/mpd/src/util.c 2016/11/01 09:56:12 1.1.1.3 @@ -10,13 +10,17 @@ #include "ppp.h" #include "util.h" #include +#include +#include #include #include #include #include #include #include +#include +#include /* * DEFINITIONS @@ -32,6 +36,7 @@ * INTERNAL VARIABLES */ +#ifndef USE_NG_PRED1 static const u_int16_t Crc16Table[256] = { /* 00 */ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, /* 08 */ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7, @@ -66,6 +71,7 @@ static const u_int16_t Crc16Table[256] = { /* f0 */ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, /* f8 */ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78 }; +#endif static FILE *lockFp = NULL; @@ -73,9 +79,6 @@ static const u_int16_t Crc16Table[256] = { * INTERNAL FUNCTIONS */ - static int UuLock(const char *devname); - static int UuUnlock(const char *devname); - static void Escape(char *line); static char *ReadLine(FILE *fp, int *lineNum, char *result, int resultsize); @@ -130,7 +133,7 @@ ExecCmd(int log, const char *label, const char *fmt, . /* Hide any stdout output of command */ - snprintf(cmdn + strlen(cmdn), sizeof(cmdn) - strlen(cmdn), " >/dev/null 2>&1"); + snprintf(cmdn + strlen(cmdn), sizeof(cmdn) - strlen(cmdn), " >%s 2>&1", _PATH_DEVNULL); /* Do command */ @@ -202,9 +205,9 @@ ExecCmdNosh(int log, const char *label, const char *fm (void)sigaction(SIGQUIT, &quitact, NULL); (void)sigprocmask(SIG_SETMASK, &oldsigblock, NULL); close(1); - open("/dev/null", O_WRONLY); + open(_PATH_DEVNULL, O_WRONLY); close(2); - open("/dev/null", O_WRONLY); + open(_PATH_DEVNULL, O_WRONLY); execv(argv[0], argv); exit(127); default: /* parent */ @@ -388,7 +391,7 @@ ReadFile(const char *filename, const char *target, /* Open file */ if ((fp = OpenConfFile(filename, &cf)) == NULL) - return(-1); + return(-2); /* Find label */ @@ -666,6 +669,7 @@ ReadLine(FILE *fp, int *lineNum, char *result, int res return(result); } +#ifdef PHYSTYPE_MODEM /* * OpenSerialDevice() * @@ -737,12 +741,12 @@ ExclusiveOpenDevice(const char *label, const char *pat /* Lock device UUCP style, if it resides in /dev */ - if (!strncmp(pathname, "/dev/", 5)) + if (!strncmp(pathname, _PATH_DEV, 5)) { + int res; ttyname = pathname + 5; - if (UuLock(ttyname) < 0) - { - Log(LG_ERR, ("[%s] can't lock device %s", label, ttyname)); + if ((res = uu_lock(ttyname)) != UU_LOCK_OK) { + Log(LG_ERR, ("[%s] uu_lock(%s): %s", label, ttyname, uu_lockerr(res))); return(-1); } locked = TRUE; @@ -757,7 +761,7 @@ ExclusiveOpenDevice(const char *label, const char *pat { Perror("[%s] can't open %s", label, pathname); if (locked) - UuUnlock(ttyname); + uu_unlock(ttyname); return(-1); } @@ -768,7 +772,7 @@ ExclusiveOpenDevice(const char *label, const char *pat Log(LG_ERR, ("[%s] can't open %s after %d secs", label, pathname, MAX_OPEN_DELAY)); if (locked) - UuUnlock(ttyname); + uu_unlock(ttyname); return(-1); } (void) fcntl(fd, F_SETFD, 1); @@ -810,93 +814,17 @@ ExclusiveCloseDevice(const char *label, int fd, const /* Remove lock */ - if (!strncmp(pathname, "/dev/", 5)) + if (!strncmp(pathname, _PATH_DEV, 5)) { ttyname = pathname + 5; - if (UuUnlock(ttyname) < 0) + if (uu_unlock(ttyname) < 0) Perror("[%s] can't unlock %s", label, ttyname); } } +#endif /* PHYSTYPE_MODEM */ -/* - * UuLock() - * - * Try to atomically create lockfile. Returns negative if failed. - */ -static int -UuLock(const char *ttyname) -{ - int fd, pid; - char tbuf[sizeof(PATH_LOCKFILENAME) + MAX_FILENAME]; - char pid_buf[64]; - - snprintf(tbuf, sizeof(tbuf), PATH_LOCKFILENAME, ttyname); - if ((fd = open(tbuf, O_RDWR|O_CREAT|O_EXCL, 0664)) < 0) - { - - /* File is already locked; Check to see if the process - * holding the lock still exists */ - - if ((fd = open(tbuf, O_RDWR, 0)) < 0) - { - Perror("%s: open(%s)", __FUNCTION__, tbuf); - return(-1); - } - - if (read(fd, pid_buf, sizeof(pid_buf)) <= 0) - { - (void)close(fd); - Perror("%s: read", __FUNCTION__); - return(-1); - } - - pid = atoi(pid_buf); - - if (kill(pid, 0) == 0 || errno != ESRCH) - { - (void)close(fd); /* process is still running */ - return(-1); - } - - /* The process that locked the file isn't running, so we'll lock it */ - - if (lseek(fd, (off_t) 0, L_SET) < 0) - { - (void)close(fd); - Perror("%s: lseek", __FUNCTION__); - return(-1); - } - } - -/* Finish the locking process */ - - sprintf(pid_buf, "%10u\n", (int) gPid); - if (write(fd, pid_buf, strlen(pid_buf)) != strlen(pid_buf)) - { - (void)close(fd); - (void)unlink(tbuf); - Perror("%s: write", __FUNCTION__); - return(-1); - } - (void)close(fd); - return(0); -} - /* - * UuUnlock() - */ - -static int -UuUnlock(const char *ttyname) -{ - char tbuf[sizeof(PATH_LOCKFILENAME) + MAX_FILENAME]; - - (void) sprintf(tbuf, PATH_LOCKFILENAME, ttyname); - return(unlink(tbuf)); -} - -/* * GenerateMagic() * * Generate random number which will be used as magic number. @@ -925,7 +853,8 @@ GenerateMagic(void) int PIDCheck(const char *filename, int killem) { - int fd = -1, n_tries; + int n_tries; + struct pidfh *pfh = NULL; /* Sanity */ @@ -933,88 +862,43 @@ PIDCheck(const char *filename, int killem) /* Atomically open and lock file */ - for (n_tries = 0; - n_tries < MAX_LOCK_ATTEMPTS - && (fd = open(filename, O_RDWR|O_CREAT|O_EXLOCK|O_NONBLOCK, 0644)) < 0; - n_tries++) + for (n_tries = 0; n_tries < MAX_LOCK_ATTEMPTS; n_tries++) { - int nscan, old_pid; - FILE *fp; + pid_t old_pid; - /* Abort on any unexpected errors */ - - if (errno != EAGAIN) - { - Perror("%s: open(%s)", __FUNCTION__, filename); - return(-1); + pfh = pidfile_open(filename, 0644, &old_pid); + if (pfh == NULL) { + if (errno == EEXIST) { + if (!killem) { + Log(LG_ERR, ("already running as process %d", old_pid)); + return(-1); + } + if (kill(old_pid, SIGTERM) < 0) + switch (errno) { + case ESRCH: + Log(LG_ERR, ("process %d no longer exists", old_pid)); + break; + default: + Perror("%s: kill(%d)", __FUNCTION__, old_pid); + return(-1); + } + /* Wait and try again */ + Log(LG_ERR, ("waiting for process %d to die...", old_pid)); + sleep(1); + } else { + Perror("cannot open pid file"); + return(-1); + } + } else { + pidfile_write(pfh); + break; } - - /* We're already running ... see who it is */ - - if ((fp = fopen(filename, "r")) == NULL) - { - Perror("%s: fopen(%s)", __FUNCTION__, filename); - return(-1); - } - - /* If there's a PID in there, sniff it out */ - - nscan = fscanf(fp, "%d", &old_pid); - fclose(fp); - if (nscan != 1) - { - Log(LG_ERR, ("%s: contents mangled", filename)); - return(-1); - } - - /* Maybe kill the other guy */ - - if (!killem) - { - Log(LG_ERR, ("already running as process %d", old_pid)); - return(-1); - } - if (kill(old_pid, SIGTERM) < 0) - switch (errno) - { - case ESRCH: - Log(LG_ERR, ("process %d no longer exists", old_pid)); - break; - default: - Perror("%s: kill(%d)", __FUNCTION__, old_pid); - return(-1); - } - - /* Wait and try again */ - - Log(LG_ERR, ("waiting for process %d to die...", old_pid)); - sleep(1); } if (n_tries == MAX_LOCK_ATTEMPTS) { Log(LG_ERR, ("can't lock %s after %d attempts", filename, n_tries)); return(-1); } - -/* Close on exec */ - - (void) fcntl(fd, F_SETFD, 1); - -/* Create a stream on top of file descriptor */ - - if ((lockFp = fdopen(fd, "r+")) == NULL) - { - Perror("%s: fdopen", __FUNCTION__); - return(-1); - } - setbuf(lockFp, NULL); - -/* Write my PID in there */ - - rewind(lockFp); - fprintf(lockFp, "%u\n", (u_int) gPid); - fflush(lockFp); - (void) ftruncate(fileno(lockFp), ftell(lockFp)); return(0); } @@ -1093,7 +977,7 @@ TcpGetListenPort(struct u_addr *addr, in_port_t port, /* Make socket available for connections */ - if (listen(sock, 2) < 0) + if (listen(sock, -1) < 0) { Perror("%s: listen", __FUNCTION__); (void) close(sock); @@ -1186,12 +1070,19 @@ Bin2Hex(const unsigned char *bin, size_t len) size_t i, j; char *buf; - buf = Malloc(MB_UTIL, len * 2 + 1); - for (i = j = 0; i < len; i++) { - buf[j++] = hexconvtab[bin[i] >> 4]; - buf[j++] = hexconvtab[bin[i] & 15]; + if (len > 0) { + buf = Malloc(MB_UTIL, len * 2 + 1); + for (i = j = 0; i < len; i++) { + buf[j++] = hexconvtab[bin[i] >> 4]; + buf[j++] = hexconvtab[bin[i] & 15]; + } + buf[j] = 0; + } else { + buf = Malloc(MB_UTIL, 3); + buf[0] = '0'; + buf[1] = '0'; + buf[2] = 0; } - buf[j] = 0; return buf; } @@ -1228,6 +1119,7 @@ HexVal(char c) } } +#ifndef USE_NG_PRED1 /* * Crc16() * @@ -1242,6 +1134,7 @@ Crc16(u_short crc, u_char *cp, int len) crc = (crc >> 8) ^ Crc16Table[(crc ^ *cp++) & 0xff]; return(crc); } +#endif /* * GetAnyIpAddress() @@ -1434,8 +1327,10 @@ GetEther(struct u_addr *addr, struct sockaddr_dl *hwad ifreq.ifr_addr = ifr->ifr_addr; /* Check that the interface is up, and not point-to-point or loopback */ - if (ioctl(s, SIOCGIFFLAGS, &ifreq) < 0) + if (ioctl(s, SIOCGIFFLAGS, &ifreq) < 0) { + Log(LG_IFACE2, ("ioctl(SIOCGIFFLAGS, %s): %d", ifr->ifr_name, errno)); continue; + } if ((ifreq.ifr_flags & (IFF_UP|IFF_BROADCAST|IFF_POINTOPOINT|IFF_LOOPBACK|IFF_NOARP)) != (IFF_UP|IFF_BROADCAST)) @@ -1514,7 +1409,7 @@ GetPeerEther(struct u_addr *addr, struct sockaddr_dl * mib[5] = 0; #endif if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) { - Log(LG_ERR, ("route-sysctl-estimate")); + Perror("route-sysctl-estimate"); return (0); } if (needed == 0) /* empty table */ @@ -1594,3 +1489,19 @@ ppp_util_ascify(char *buf, size_t bsiz, const char *da *bp = '\0'; } +#ifndef HAVE_NTOA_R +/* + * Convert a binary representation of an ethernet address to an ASCII string. + */ +char * +ether_ntoa_r(const struct ether_addr *n, char *a) +{ + int i; + + i = sprintf(a, "%02x:%02x:%02x:%02x:%02x:%02x", n->octet[0], + n->octet[1], n->octet[2], n->octet[3], n->octet[4], n->octet[5]); + if (i < 17) + return (NULL); + return (a); +} +#endif