139213Sgibbs/* newseed.c: The opienewseed() library function. 239213Sgibbs 339213Sgibbs%%% copyright-cmetz-96 439213SgibbsThis software is Copyright 1996-2001 by Craig Metz, All Rights Reserved. 539213SgibbsThe Inner Net License Version 3 applies to this software. 639213SgibbsYou should have received a copy of the license with this software. If 739213Sgibbsyou didn't get a copy, you may request one from <license@inner.net>. 839213Sgibbs 939213Sgibbs History: 1039213Sgibbs 1139213Sgibbs Modified by cmetz for OPIE 2.4. Greatly simplified increment. Now does 1239213Sgibbs not add digits. Reformatted the code. 1339213Sgibbs Modified by cmetz for OPIE 2.32. Added syslog.h if DEBUG. 1439213Sgibbs Modified by cmetz for OPIE 2.31. Added time.h. 1539213Sgibbs Created by cmetz for OPIE 2.22. 1639213Sgibbs 1739213Sgibbs$FreeBSD: releng/10.3/contrib/opie/libopie/newseed.c 109680 2003-01-22 10:55:36Z des $ 1839213Sgibbs*/ 1939213Sgibbs 2039213Sgibbs#include "opie_cfg.h" 2139213Sgibbs#if HAVE_TIME_H 2239213Sgibbs#include <time.h> 2339213Sgibbs#endif /* HAVE_TIME_H */ 2439213Sgibbs#if HAVE_STRING_H 2539213Sgibbs#include <string.h> 2639213Sgibbs#endif /* HAVE_STRING_H */ 2739213Sgibbs#include <ctype.h> 2850477Speter#if HAVE_UNISTD_H 2939213Sgibbs#include <unistd.h> 3039213Sgibbs#endif /* HAVE_UNISTD_H */ 3139213Sgibbs#if HAVE_SYS_UTSNAME_H 3239213Sgibbs#include <sys/utsname.h> 3339213Sgibbs#endif /* HAVE_SYS_UTSNAME_H */ 3439213Sgibbs#include <errno.h> 3539213Sgibbs#if DEBUG 3660041Sphk#include <syslog.h> 3739213Sgibbs#endif /* DEBUG */ 3839213Sgibbs#include "opie.h" 3939213Sgibbs 4050073Skenint opienewseed FUNCTION((seed), char *seed) 4139213Sgibbs{ 4239213Sgibbs if (!seed) 4339213Sgibbs return -1; 4439213Sgibbs 4539213Sgibbs if (seed[0]) { 4639213Sgibbs char *c; 4739213Sgibbs unsigned int i, max; 4839213Sgibbs 4939213Sgibbs if ((i = strlen(seed)) > OPIE_SEED_MAX) 5039213Sgibbs i = OPIE_SEED_MAX; 5139213Sgibbs 5239213Sgibbs for (c = seed + i - 1, max = 1; 5350073Sken (c >= seed) && isdigit(*c); c--) 5450073Sken max *= 10; 5539213Sgibbs 5639213Sgibbs if ((i = strtoul(++c, (char **)0, 10)) < max) { 5739213Sgibbs if (++i >= max) 5839213Sgibbs i = 1; 5939213Sgibbs 6039213Sgibbs sprintf(c, "%d", i); 6139213Sgibbs return 0; 6239213Sgibbs } 6339213Sgibbs } 6439213Sgibbs 6539213Sgibbs { 6639213Sgibbs time_t now; 6739213Sgibbs 6839213Sgibbs time(&now); 6939213Sgibbs srand(now); 7039213Sgibbs } 7139213Sgibbs 7239213Sgibbs { 7339213Sgibbs struct utsname utsname; 7439213Sgibbs 7539213Sgibbs if (uname(&utsname) < 0) { 7639213Sgibbs#if DEBUG 7739213Sgibbs syslog(LOG_DEBUG, "uname: %s(%d)", strerror(errno), 7839213Sgibbs errno); 7959249Sphk#endif /* DEBUG */ 8039213Sgibbs utsname.nodename[0] = 'k'; 8160938Sjake utsname.nodename[1] = 'e'; 8239213Sgibbs } 8339213Sgibbs utsname.nodename[2] = 0; 8439213Sgibbs 8550073Sken if (snprintf(seed, OPIE_SEED_MAX+1, "%s%04d", utsname.nodename, 8653257Sken (rand() % 9999) + 1) >= OPIE_SEED_MAX+1) 8739213Sgibbs return -1; 8839213Sgibbs return 0; 8939213Sgibbs } 9039213Sgibbs} 9139213Sgibbs 9239213Sgibbs