Czytamy z /dev/urandom przez read, nie fread
authorMichał Bartoszkiewicz <mbartoszkiewicz@gmail.com>
Thu, 12 Feb 2015 17:38:34 +0000 (18:38 +0100)
committerMichał Bartoszkiewicz <mbartoszkiewicz@gmail.com>
Thu, 12 Feb 2015 17:38:34 +0000 (18:38 +0100)
choinka.c

index b117972281f325bb341ccf914f85202cf741fbce..7f64945f71ef7d2df5e043591544576817937854 100644 (file)
--- a/choinka.c
+++ b/choinka.c
@@ -1,7 +1,10 @@
+#include <fcntl.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <term.h>
 #include <time.h>
+#include <unistd.h>
 
 #define A_POGRUBIONY (1 << 0)
 
@@ -38,16 +41,16 @@ static atrybut const gwiazdka = {A_POGRUBIONY, KOLOR_BRAZOWY};
 
 static void inicjuj_rng()
 {
-  unsigned ziarno = 0;
-  FILE* f = fopen("/dev/urandom", "rb");
-  if (f != NULL) {
-    unsigned nowe_ziarno;
-    if (fread(&nowe_ziarno, sizeof nowe_ziarno, 1, f) == 1) {
-      ziarno = nowe_ziarno;
+  bool ok = false;
+  unsigned ziarno;
+  int f = open("/dev/urandom", O_RDONLY);
+  if (f != -1) {
+    if (read(f, &ziarno, sizeof ziarno) == sizeof ziarno) {
+      ok = true;
     }
-    fclose(f);
+    close(f);
   }
-  if (ziarno == 0) {
+  if (!ok) {
     ziarno = time(NULL);
   }
   srand(ziarno);