123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- #ifndef STRNPWD_SOURCE
- #define STRNPWD_SOURCE
- #include <unistd.h>
- #include <fcntl.h>
- #include <errno.h>
- #include "../tools/types.h"
- #include "../tools/error.h"
- #include "../key/keys.h"
- char * strnpwd (char buffer [], unsigned length, unsigned count, unsigned group, char space)
- {
- signed fd;
- if ((fd = open ("/dev/urandom", O_RDONLY)) == -1)
- {
- error (1, errno, "can't open /dev/urandom");
- }
- while (count--)
- {
- static const char alphabet [] =
- {
- '2',
- '3',
- '4',
- '5',
- '6',
- '7',
- '8',
- '9',
- 'A',
- 'B',
- 'C',
- 'D',
- 'E',
- 'F',
- 'G',
- 'H',
- 'J',
- 'K',
- 'L',
- 'M',
- 'N',
- 'P',
- 'Q',
- 'R',
- 'S',
- 'T',
- 'U',
- 'V',
- 'W',
- 'X',
- 'Y',
- 'Z'
- };
- unsigned member;
- if (read (fd, & member, sizeof (member)) != sizeof (member))
- {
- error (1, errno, "can't read /dev/urandom");
- }
- if (length)
- {
- *buffer = alphabet [member % sizeof (alphabet)];
- buffer++;
- length--;
- }
- if ((count) && (group) && ! (count % group))
- {
- if (length)
- {
- *buffer = space;
- buffer++;
- length--;
- }
- }
- }
- close (fd);
- return (buffer);
- }
- #endif
|