summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2019-09-23 09:29:40 +0200
committerErich Eckner <git@eckner.net>2019-09-23 09:29:40 +0200
commit9f2414fcb6c59a39821682943dbf749cfaf05c3d (patch)
treef72826f4a6657821ef881b65c46c0cf6d407ccd9
parentac8952d8aa16466ec9b813635922a57707e1c469 (diff)
downloadraspi-sensor-9f2414fcb6c59a39821682943dbf749cfaf05c3d.tar.xz
sensor.c: run as "nobody", ommit debug output
-rw-r--r--sensor.c57
1 files changed, 40 insertions, 17 deletions
diff --git a/sensor.c b/sensor.c
index f764817..0cddafc 100644
--- a/sensor.c
+++ b/sensor.c
@@ -14,6 +14,8 @@
#include "wiringx.h"
+void drop_privileges();
+
int main() {
if(wiringXSetup("raspberrypi3", NULL) == -1) {
@@ -26,7 +28,19 @@ int main() {
pinMode(9, PINMODE_INPUT);
pinMode(8, PINMODE_OUTPUT);
- while(1) {
+ drop_privileges();
+
+ // start bit
+ digitalWrite(8, HIGH);
+ usleep(18000);
+ digitalWrite(8, LOW);
+ int bit = -3;
+ char data[5];
+ memset(&data[0], 0, 5);
+ while ((bit != 40) || ((data[0]+data[1]+data[2]+data[3]-data[4]) % 255 != 0)) {
+ sleep(2);
+ if (bit > -3)
+ fprintf(stderr, ".");
// start bit
digitalWrite(8, HIGH);
usleep(18000);
@@ -34,31 +48,40 @@ int main() {
long int cycles = 0;
int last_state = digitalRead(9);
// ignore 2 bits: reaction on command + "official" start bit
- int bit = -2;
- char data[5];
+ bit = -2;
memset(&data[0], 0, 5);
while (cycles < 100000) {
cycles++;
if (last_state == digitalRead(9))
continue;
if (last_state == 1) {
- if (bit >= 0) {
- if (cycles>400) {
- printf("1");
- data[bit / 8] |= 1 << 7 - (bit % 8);
- } else
- printf("0");
- if ((bit+1) % 8 == 0)
- printf(" ");
- }
+ if ((bit >= 0) && (cycles>400))
+ data[bit / 8] |= 1 << 7 - (bit % 8);
bit++;
}
cycles = 0;
last_state = 1-last_state;
}
- if ((bit == 40) && ((data[0]+data[1]+data[2]+data[3]-data[4]) % 255 == 0))
- printf(" %f %f", data[0] + data[1]/256., data[2] + data[3]/256.);
- printf("\n\n");
- sleep(2);
}
-}
+ printf("RH: %f %%\nT: %f °C\n", data[0] + data[1]/256., data[2] + data[3]/256.);
+} // main
+
+//
+// Drop (root) privileges
+//
+void drop_privileges() {
+ /* Drop superuser privileges in correct order */
+
+ int is_already_unprivileged = 0;
+
+ if (setgid(65534) == -1) { // nobody
+ perror("can't drop group privileges");
+ if (! (is_already_unprivileged = (errno == 1)))
+ exit(-1);
+ }
+ if (setuid(65534) == -1) { // nobody
+ perror("can't drop user privileges");
+ if (is_already_unprivileged != (errno == 1))
+ exit(-1);
+ }
+} // drop_privileges