[v2] fff-random: rewrite in C

Submitted by Tim Niemeyer on July 2, 2017, 5:52 p.m.

Details

Message ID 1499017976-15485-1-git-send-email-tim@tn-x.org
State Superseded
Headers show

Commit Message

Tim Niemeyer July 2, 2017, 5:52 p.m.
Fixes: #51

Signed-off-by: Tim Niemeyer <tim@tn-x.org>
---

Changes in v2:
- added fclose
- use %u instead of %d

 src/packages/fff/fff-random/Makefile             | 27 ++++++------
 src/packages/fff/fff-random/files/usr/bin/random | 16 -------
 src/packages/fff/fff-random/src/Makefile         |  4 ++
 src/packages/fff/fff-random/src/random.c         | 53 ++++++++++++++++++++++++
 4 files changed, 71 insertions(+), 29 deletions(-)
 delete mode 100755 src/packages/fff/fff-random/files/usr/bin/random
 create mode 100644 src/packages/fff/fff-random/src/Makefile
 create mode 100644 src/packages/fff/fff-random/src/random.c

Patch hide | download patch | download mbox

diff --git a/src/packages/fff/fff-random/Makefile b/src/packages/fff/fff-random/Makefile
index 95e5786..066adc3 100644
--- a/src/packages/fff/fff-random/Makefile
+++ b/src/packages/fff/fff-random/Makefile
@@ -1,40 +1,41 @@ 
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=fff-random
-PKG_VERSION:=0.0.1
+PKG_VERSION:=2
 PKG_RELEASE:=1
 
-PKG_BUILD_DIR:=$(BUILD_DIR)/fff-random
+PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
 
 include $(INCLUDE_DIR)/package.mk
 
 define Package/fff-random
-    SECTION:=base
-    CATEGORY:=Freifunk
-    TITLE:=Freifunk-Franken Random
-    URL:=http://www.freifunk-franken.de
-    DEPENDS:=+@BUSYBOX_CONFIG_ASH
+	SECTION:=base
+	CATEGORY:=Freifunk
+	TITLE:=Freifunk-Franken Random
+	URL:=http://www.freifunk-franken.de
 endef
 
 define Package/fff-random/description
-    This is the Freifunk Franken Firmware Random package
-    This packages provides a random function.
+	This is the Freifunk Franken Firmware Random package
+	This packages provides a random function.
 endef
 
 define Build/Prepare
-    echo "all: " > $(PKG_BUILD_DIR)/Makefile
+	mkdir -p $(PKG_BUILD_DIR)
+	$(CP) ./src/* $(PKG_BUILD_DIR)/
 endef
 
 define Build/Configure
-    # nothing
+	# nothing
 endef
 
 define Build/Compile
-    # nothing
+	CFLAGS="$(TARGET_CFLAGS)" CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)
 endef
 
 define Package/fff-random/install
-    $(CP) ./files/* $(1)/
+	$(INSTALL_DIR) $(1)/usr/bin
+	$(INSTALL_BIN) $(PKG_BUILD_DIR)/random $(1)/usr/bin/
 endef
 
 $(eval $(call BuildPackage,fff-random))
diff --git a/src/packages/fff/fff-random/files/usr/bin/random b/src/packages/fff/fff-random/files/usr/bin/random
deleted file mode 100755
index 8f11470..0000000
--- a/src/packages/fff/fff-random/files/usr/bin/random
+++ /dev/null
@@ -1,16 +0,0 @@ 
-#!/bin/sh
-# Freifunk Franken Random Number Script
-# Tim Niemeyer
-# 29.11.2015
-# License GPLv2
-
-FROM=${1:-0}
-UNTIL=${2:-100}
-
-diff=$(( UNTIL - FROM ))
-numbers=$(( $(echo $diff | wc -c) -1 ))
-
-rand=$(</dev/urandom tr -dc 0-9 | head -c $numbers | sed -e 's/^0*//g')
-
-echo $(( (rand % diff) + FROM ))
-
diff --git a/src/packages/fff/fff-random/src/Makefile b/src/packages/fff/fff-random/src/Makefile
new file mode 100644
index 0000000..ab181d5
--- /dev/null
+++ b/src/packages/fff/fff-random/src/Makefile
@@ -0,0 +1,4 @@ 
+all: random
+
+random: random.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o $@ $^ $(LDLIBS)
diff --git a/src/packages/fff/fff-random/src/random.c b/src/packages/fff/fff-random/src/random.c
new file mode 100644
index 0000000..edfb41f
--- /dev/null
+++ b/src/packages/fff/fff-random/src/random.c
@@ -0,0 +1,53 @@ 
+/*
+ * Simple random tool, used to get a random value
+ * 2017-07-02
+ * Tim Niemeyer
+ * GPLv2
+ */
+#include <stdio.h>
+#include <stdlib.h>
+
+int main(int argc, char **argv)
+{
+        int from = 0;
+        int to = 100;
+        int diff = 1;
+        FILE *f = 0;
+        unsigned int r = 0;
+
+        if (argc != 1 && argc != 3)
+        {
+                printf("%s <from> <to>\n", argv[0]);
+                return -1;
+        }
+        else if (argc == 3)
+        {
+                from = atoi(argv[1]);
+                to = atoi(argv[2]);
+        }
+
+        diff = to - from;
+        if (diff <= 0)
+        {
+                printf("Bad from/to\n");
+                return -1;
+        }
+
+        f = fopen("/dev/urandom", "r");
+        if (!f)
+        {
+                printf("Can't open /dev/urandom\n");
+                return -1;
+        }
+
+        if (1U != fread(&r, sizeof(unsigned int), 1U, f))
+        {
+                printf("Can't read /dev/urandom\n");
+                fclose(f);
+                return -1;
+        }
+
+        printf("%u\n", (r % (diff +1 )) + from);
+        fclose(f);
+        return 0;
+}

Comments

Peter J. Philipp July 2, 2017, 7:18 p.m.
Danke.  Jetzt sieht es besser aus.  Das Programm kann wohl auch hängen im fread() wenn das Computer System kein Entropy (Entropie) mehr hat und /dev/urandom nichts schreiben kann.. das ist aber besser als die alternative.

Sieht OK aus.

Reviewed-by:  Peter J. Philipp <pjp@centroid.eu <mailto:pjp@centroid.eu>>

-peter


> Am 02.07.2017 um 19:52 schrieb Tim Niemeyer <tim@tn-x.org>:
> 
> Fixes: #51
> 
> Signed-off-by: Tim Niemeyer <tim@tn-x.org>
> ---
> 
> Changes in v2:
> - added fclose
> - use %u instead of %d
> 
> src/packages/fff/fff-random/Makefile             | 27 ++++++------
> src/packages/fff/fff-random/files/usr/bin/random | 16 -------
> src/packages/fff/fff-random/src/Makefile         |  4 ++
> src/packages/fff/fff-random/src/random.c         | 53 ++++++++++++++++++++++++
> 4 files changed, 71 insertions(+), 29 deletions(-)
> delete mode 100755 src/packages/fff/fff-random/files/usr/bin/random
> create mode 100644 src/packages/fff/fff-random/src/Makefile
> create mode 100644 src/packages/fff/fff-random/src/random.c
> 
> diff --git a/src/packages/fff/fff-random/Makefile b/src/packages/fff/fff-random/Makefile
> index 95e5786..066adc3 100644
> --- a/src/packages/fff/fff-random/Makefile
> +++ b/src/packages/fff/fff-random/Makefile
> @@ -1,40 +1,41 @@
> include $(TOPDIR)/rules.mk
> 
> PKG_NAME:=fff-random
> -PKG_VERSION:=0.0.1
> +PKG_VERSION:=2
> PKG_RELEASE:=1
> 
> -PKG_BUILD_DIR:=$(BUILD_DIR)/fff-random
> +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
> 
> include $(INCLUDE_DIR)/package.mk
> 
> define Package/fff-random
> -    SECTION:=base
> -    CATEGORY:=Freifunk
> -    TITLE:=Freifunk-Franken Random
> -    URL:=http://www.freifunk-franken.de
> -    DEPENDS:=+@BUSYBOX_CONFIG_ASH
> +	SECTION:=base
> +	CATEGORY:=Freifunk
> +	TITLE:=Freifunk-Franken Random
> +	URL:=http://www.freifunk-franken.de
> endef
> 
> define Package/fff-random/description
> -    This is the Freifunk Franken Firmware Random package
> -    This packages provides a random function.
> +	This is the Freifunk Franken Firmware Random package
> +	This packages provides a random function.
> endef
> 
> define Build/Prepare
> -    echo "all: " > $(PKG_BUILD_DIR)/Makefile
> +	mkdir -p $(PKG_BUILD_DIR)
> +	$(CP) ./src/* $(PKG_BUILD_DIR)/
> endef
> 
> define Build/Configure
> -    # nothing
> +	# nothing
> endef
> 
> define Build/Compile
> -    # nothing
> +	CFLAGS="$(TARGET_CFLAGS)" CPPFLAGS="$(TARGET_CPPFLAGS)" $(MAKE) -C $(PKG_BUILD_DIR) $(TARGET_CONFIGURE_OPTS)
> endef
> 
> define Package/fff-random/install
> -    $(CP) ./files/* $(1)/
> +	$(INSTALL_DIR) $(1)/usr/bin
> +	$(INSTALL_BIN) $(PKG_BUILD_DIR)/random $(1)/usr/bin/
> endef
> 
> $(eval $(call BuildPackage,fff-random))
> diff --git a/src/packages/fff/fff-random/files/usr/bin/random b/src/packages/fff/fff-random/files/usr/bin/random
> deleted file mode 100755
> index 8f11470..0000000
> --- a/src/packages/fff/fff-random/files/usr/bin/random
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -#!/bin/sh
> -# Freifunk Franken Random Number Script
> -# Tim Niemeyer
> -# 29.11.2015
> -# License GPLv2
> -
> -FROM=${1:-0}
> -UNTIL=${2:-100}
> -
> -diff=$(( UNTIL - FROM ))
> -numbers=$(( $(echo $diff | wc -c) -1 ))
> -
> -rand=$(</dev/urandom tr -dc 0-9 | head -c $numbers | sed -e 's/^0*//g')
> -
> -echo $(( (rand % diff) + FROM ))
> -
> diff --git a/src/packages/fff/fff-random/src/Makefile b/src/packages/fff/fff-random/src/Makefile
> new file mode 100644
> index 0000000..ab181d5
> --- /dev/null
> +++ b/src/packages/fff/fff-random/src/Makefile
> @@ -0,0 +1,4 @@
> +all: random
> +
> +random: random.c
> +	$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -Wall -o $@ $^ $(LDLIBS)
> diff --git a/src/packages/fff/fff-random/src/random.c b/src/packages/fff/fff-random/src/random.c
> new file mode 100644
> index 0000000..edfb41f
> --- /dev/null
> +++ b/src/packages/fff/fff-random/src/random.c
> @@ -0,0 +1,53 @@
> +/*
> + * Simple random tool, used to get a random value
> + * 2017-07-02
> + * Tim Niemeyer
> + * GPLv2
> + */
> +#include <stdio.h>
> +#include <stdlib.h>
> +
> +int main(int argc, char **argv)
> +{
> +        int from = 0;
> +        int to = 100;
> +        int diff = 1;
> +        FILE *f = 0;
> +        unsigned int r = 0;
> +
> +        if (argc != 1 && argc != 3)
> +        {
> +                printf("%s <from> <to>\n", argv[0]);
> +                return -1;
> +        }
> +        else if (argc == 3)
> +        {
> +                from = atoi(argv[1]);
> +                to = atoi(argv[2]);
> +        }
> +
> +        diff = to - from;
> +        if (diff <= 0)
> +        {
> +                printf("Bad from/to\n");
> +                return -1;
> +        }
> +
> +        f = fopen("/dev/urandom", "r");
> +        if (!f)
> +        {
> +                printf("Can't open /dev/urandom\n");
> +                return -1;
> +        }
> +
> +        if (1U != fread(&r, sizeof(unsigned int), 1U, f))
> +        {
> +                printf("Can't read /dev/urandom\n");
> +                fclose(f);
> +                return -1;
> +        }
> +
> +        printf("%u\n", (r % (diff +1 )) + from);
> +        fclose(f);
> +        return 0;
> +}
> -- 
> 2.1.4
> 
> -- 
> franken-dev mailing list
> franken-dev@freifunk.net
> http://lists.freifunk.net/mailman/listinfo/franken-dev-freifunk.net