[PATCH v1] sg3_utils: sg_write_buffer: convert string to integer while reading from stdio

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This patch is to convert inputted string to the integer when
read data from stdin. While entering data, the data between bytes
can be separated by space, or by ',' or by '.'.

Signed-off-by: Bean Huo <beanhuo@xxxxxxxxxx>
---
 src/sg_write_buffer.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/src/sg_write_buffer.c b/src/sg_write_buffer.c
index 7560e7e..902bc5d 100644
--- a/src/sg_write_buffer.c
+++ b/src/sg_write_buffer.c
@@ -195,6 +195,7 @@ main(int argc, char * argv[])
     const char * device_name = NULL;
     const char * file_name = NULL;
     unsigned char * dop = NULL;
+    unsigned char * read_buf= NULL;
     char * cp;
     const struct mode_s * mp;
     char ebuff[EBUFF_SZ];
@@ -394,6 +395,33 @@ main(int argc, char * argv[])
                     }
                 }
             }
+	if (infd == STDIN_FILENO) {
+		if (NULL == (read_buf = (unsigned char *)malloc(DEF_XFER_LEN))) {
+			pr2serr(ME "out of memory\n");
+			ret = SG_LIB_SYNTAX_ERROR;
+			goto err_out;
+		}
+		res = read(infd, read_buf, DEF_XFER_LEN);
+		if (res < 0) {
+			snprintf(ebuff, EBUFF_SZ, ME "couldn't read from STDIN");
+			perror(ebuff);
+			ret = SG_LIB_FILE_ERROR;
+			goto err_out;
+		}
+		char * pch;
+		int val = 0;
+		res = 0;
+		pch = strtok(read_buf, ",. ");
+		while (pch != NULL) {
+			printf("read %s ", pch);
+			val = sg_get_num_nomult(pch);
+			if (val > 0 && val < 255) {
+				dop[res] = val;
+				res++;
+			}
+			pch = strtok(NULL, ",. ");
+		}
+	} else {
             res = read(infd, dop, wb_len);
             if (res < 0) {
                 snprintf(ebuff, EBUFF_SZ, ME "couldn't read from %s",
@@ -404,6 +432,7 @@ main(int argc, char * argv[])
                 ret = SG_LIB_FILE_ERROR;
                 goto err_out;
             }
+	}
             if (res < wb_len) {
                 if (wb_len_given) {
                     pr2serr("tried to read %d bytes from %s, got %d bytes\n",
@@ -472,6 +501,8 @@ main(int argc, char * argv[])
 err_out:
     if (dop)
         free(dop);
+    if (read_buf)
+	free(read_buf);
     res = sg_cmds_close_device(sg_fd);
     if (res < 0) {
         pr2serr("close error: %s\n", safe_strerror(-res));
-- 
2.7.4




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]

  Powered by Linux