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