1 #define _XOPEN_SOURCE 600
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
17 static void usage(void)
19 printf("usage: sngen [-k] serial date [users]\n");
22 int main(int argc, char **argv)
35 while ((opt = getopt(argc, argv, "k")) != -1) {
46 if (argc - optind < 2) {
51 tz_save = getenv("TZ");
53 setenv("TZ", "UTC", 1);
56 serial = atoll(argv[optind]);
58 if (strptime(argv[optind + 1], "%d/%m/%Y", &date) == NULL) {
59 perror("Couldn't parse date");
64 strftime(timebuf, 80, "%d/%m/%Y", &date);
66 if (argc - optind >= 3) {
67 users = atoll(argv[optind + 2]);
70 key = ((time + 0xad) * (serial + users)) << 32;
71 key += ((time % serial) * (serial % 0xaf)) + ((time % (0xdead + users)) * (serial % (users + 1)));
74 printf("%04" PRIx16 "-", (key & 0xffff000000000000) >> 48);
75 printf("%04" PRIx16 "-", (key & 0xffff00000000) >> 32);
76 printf("%04" PRIx16 "-", (key & 0xffff0000) >> 16);
77 printf("%04" PRIx16 "\n", key & 0xffff);
80 printf("serial: %lld\n", serial);
81 printf("expires: %s UTC\n", timebuf);
83 printf("users: %ld\n", users);
86 printf("%04" PRIx16 "-", (key & 0xffff000000000000) >> 48);
87 printf("%04" PRIx16 "-", (key & 0xffff00000000) >> 32);
88 printf("%04" PRIx16 "-", (key & 0xffff0000) >> 16);
89 printf("%04" PRIx16 "\n", key & 0xffff);