diff options
author | David Kaspar [Dee'Kej] <dkaspar@redhat.com> | 2018-05-30 17:46:05 +0200 |
---|---|---|
committer | Dee'Kej <deekej@linuxmail.org> | 2018-06-01 14:51:29 +0200 |
commit | ecc23fe5b61bc5d501cd2fcffffcf5ab87269317 (patch) | |
tree | a877081602ad428d2e918fb8a184fe9715e4fda7 /src | |
parent | d8746bfc9d8d944082726cdcbee634b1ec72d45f (diff) | |
download | initscripts-ecc23fe5b61bc5d501cd2fcffffcf5ab87269317.tar initscripts-ecc23fe5b61bc5d501cd2fcffffcf5ab87269317.tar.gz initscripts-ecc23fe5b61bc5d501cd2fcffffcf5ab87269317.tar.bz2 initscripts-ecc23fe5b61bc5d501cd2fcffffcf5ab87269317.tar.xz initscripts-ecc23fe5b61bc5d501cd2fcffffcf5ab87269317.zip |
src/genhostid.c: fixed to not override /etc/hostid if it already exists
Resolves: #105
Diffstat (limited to 'src')
-rw-r--r-- | src/genhostid.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/genhostid.c b/src/genhostid.c index c7561c9e..f6253bec 100644 --- a/src/genhostid.c +++ b/src/genhostid.c @@ -12,7 +12,7 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - * + * */ #include <fcntl.h> @@ -20,19 +20,28 @@ #include <time.h> #include <unistd.h> #include <sys/stat.h> -int -main (void) + +int main (void) { struct stat st; long int n; - if (stat ("/etc/hostid", &st) == 0 && S_ISREG (st.st_mode) - && st.st_size >= sizeof (n)) + + /* + * NOTE: gethostid() always returns 32-bit identifier, and st_size field + * of stat structure represents total size of file, in bytes. + */ + + if (stat ("/etc/hostid", &st) == 0 && + S_ISREG (st.st_mode) && st.st_size == 4) { return 0; + } + int fd = open ("/dev/random", O_RDONLY); - if (fd == -1 || read (fd, &n, sizeof (n)) != sizeof (n)) - { - srand48 ((long int) time (NULL) ^ (long int) getpid ()); - n = lrand48 (); - } - return sethostid ((int32_t)n); + + if (fd == -1 || read (fd, &n, sizeof (n)) != sizeof (n)) { + srand48 ((long int) time (NULL) ^ (long int) getpid ()); + n = lrand48 (); + } + + return sethostid ((int32_t) n); } |