/* GNU Mailutils -- a suite of utilities for electronic mail Copyright (C) 2017-2021 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; If not, see . */ #ifdef HAVE_CONFIG_H #include #endif #include #include #include #include #include #include #include #define SID_ABC "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" #define SID_LEN (sizeof (SID_ABC) - 1) #define SID_LEN_SQR (SID_LEN * SID_LEN) /* Generate (almost) unique session ID. The idea borrowed from Sendmail queue ID. */ int mu_sid (char **res) { static int init; static unsigned int seqno = 0; static char abc[] = SID_ABC; struct timeval t; struct tm *tm; unsigned int n; char sidbuf[9]; char *p; if (!res) return MU_ERR_OUT_PTR_NULL; gettimeofday (&t, NULL); if (!init) { seqno = getpid () + t.tv_sec + t.tv_usec; init = 1; } n = seqno++ % SID_LEN_SQR; tm = gmtime (&t.tv_sec); sidbuf[0] = abc[tm->tm_year % SID_LEN]; sidbuf[1] = abc[tm->tm_mon]; sidbuf[2] = abc[tm->tm_mday]; sidbuf[3] = abc[tm->tm_hour]; sidbuf[4] = abc[tm->tm_min % SID_LEN]; sidbuf[5] = abc[tm->tm_sec % SID_LEN]; sidbuf[6] = abc[n / SID_LEN]; sidbuf[7] = abc[n % SID_LEN]; sidbuf[8] = 0; p = strdup (sidbuf); if (!p) return errno; *res = p; return 0; }