From 732d1963ed83abf4e5f1b06ec451a6943421d716 Mon Sep 17 00:00:00 2001
From: Guo Wenxue <guowenxue@gmail.com>
Date: Thu, 22 Sep 2022 00:36:11 +0800
Subject: [PATCH] update ds18b20.c to snprintf

---
 apue/1.File_IO/ds18b20.c |   73 +++++++++++++++++++-----------------
 1 files changed, 39 insertions(+), 34 deletions(-)

diff --git a/apue/1.File_IO/ds18b20.c b/apue/1.File_IO/ds18b20.c
index d170de1..0ff2a34 100644
--- a/apue/1.File_IO/ds18b20.c
+++ b/apue/1.File_IO/ds18b20.c
@@ -1,14 +1,14 @@
 /*********************************************************************************
- *      Copyright:  (C) 2018 LingYun IoT System Studio
+ *      Copyright:  (C) 2022 LingYun IoT System Studio
  *                  All rights reserved.
  *
  *       Filename:  ds18b20.c
- *    Description:  This file is temperature sensor DS18B20 code
- *                 
+ *    Description:  This file is DS18B20 temperature sensor example source code.
+ *              
  *        Version:  1.0.0(2018/10/14)
  *         Author:  Guo Wenxue <guowenxue@gmail.com>
  *      ChangeLog:  1, Release initial version on "2018/10/14 12:13:26"
- *                 
+ *              
  ********************************************************************************/
 
 #include <stdio.h>
@@ -24,40 +24,41 @@
 
 int main(int argc, char *argv[])
 {
-        float       temp;
+    float       temp;
 
-        if( ds18b20_get_temperature(&temp) < 0 )
-        {
-                printf("ERROR: ds18b20 get temprature failure\n");
-                return 1;
-        }
+    if( ds18b20_get_temperature(&temp) < 0 )
+    {
+        printf("ERROR: ds18b20 get temprature failure\n");
+        return 1;
+    }
 
-        printf("DS19B20 get temperature: %f ℃\n", temp);
-        return 0;
+    printf("DS18B20 get temperature: %f 'C\n", temp);
+    return 0;
 }
 
 
 /* File Content:
-   pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave 
+   pi@raspberrypi:~/guowenxue $ cat /sys/bus/w1/devices/28-041731f7c0ff/w1_slave
    3a 01 4b 46 7f ff 0c 10 a5 : crc=a5 YES
    3a 01 4b 46 7f ff 0c 10 a5 t=19625
  */
 
 int ds18b20_get_temperature(float *temp)
 {
-    char            w1_path[50] = "/sys/bus/w1/devices/";
+    const char     *w1_path = "/sys/bus/w1/devices/";
+    char            ds_path[50];
     char            chip[20];
     char            buf[128];
     DIR            *dirp;
     struct dirent  *direntp;
     int             fd =-1;
     char           *ptr;
-    float           value;
     int             found = 0;
+    int             rv = 0;
 
     if( !temp )
     {
-            return -1;
+        return -1;
     }
 
     /*+-------------------------------------------------------------------+
@@ -76,44 +77,48 @@
             /* find and get the chipset SN filename */
             strcpy(chip,direntp->d_name);
             found = 1;
+            break;
         }
     }
     closedir(dirp);
 
     if( !found )
     {
-            printf("Can not find ds18b20 in %s\n", w1_path);
-            return -3;
+        printf("Can not find ds18b20 in %s\n", w1_path);
+        return -3;
     }
 
     /* get DS18B20 sample file full path: /sys/bus/w1/devices/28-xxxx/w1_slave */
-    strncat(w1_path, chip, sizeof(w1_path)-strlen(w1_path));
-    strncat(w1_path, "/w1_slave", sizeof(w1_path)-strlen(w1_path));
+    snprintf(ds_path, sizeof(ds_path), "%s/%s/w1_slave", w1_path, chip);
 
     /* open file /sys/bus/w1/devices/28-xxxx/w1_slave to get temperature */
-    if( (fd=open(w1_path, O_RDONLY)) < 0 ) 
-    { 
-            printf("open %s error: %s\n", w1_path, strerror(errno)); 
-            return -4;
-    } 
-    
+    if( (fd=open(ds_path, O_RDONLY)) < 0 )
+    {
+        printf("open %s error: %s\n", ds_path, strerror(errno));
+        return -4;
+    }
+
     if(read(fd, buf, sizeof(buf)) < 0)
     {
-            printf("read %s error: %s\n", w1_path, strerror(errno)); 
-            return -5;
-    } 
-    
+        printf("read %s error: %s\n", ds_path, strerror(errno));
+        rv = -5;
+        goto cleanup;
+    }
+
     ptr = strstr(buf, "t=");
     if( !ptr )
     {
-            printf("ERROR: Can not get temperature\n");
-            return -6;
+        printf("ERROR: Can not get temperature\n");
+        rv = -6;
+        goto cleanup;
     }
 
     ptr+=2;
 
     /* convert string value to float value */
     *temp = atof(ptr)/1000;
-   
-    return 0;
+
+cleanup:
+    close(fd);
+    return rv;
 }

--
Gitblit v1.9.1