aboutsummaryrefslogtreecommitdiff
path: root/src/sg_unmap.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2016-02-02 04:21:27 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2016-02-02 04:21:27 +0000
commitc68b788ce091800ab12ad6a37681d0c1ee275ca0 (patch)
tree87fcb51f0e9ba2b6bdf98e732ae097238b116ba2 /src/sg_unmap.c
parent572d431816271830cc321c2c7b596236e5708ea0 (diff)
downloadsg3_utils-c68b788ce091800ab12ad6a37681d0c1ee275ca0.tar.gz
sg_unaligned.h: gets for variable length unsigned integers; sg_inq: version descriptor list to 20160125
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@658 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_unmap.c')
-rw-r--r--src/sg_unmap.c45
1 files changed, 27 insertions, 18 deletions
diff --git a/src/sg_unmap.c b/src/sg_unmap.c
index cdaba327..024499d0 100644
--- a/src/sg_unmap.c
+++ b/src/sg_unmap.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009-2015 Douglas Gilbert.
+ * Copyright (c) 2009-2016 Douglas Gilbert.
* All rights reserved.
* Use of this source code is governed by a BSD-style
* license that can be found in the BSD_LICENSE file.
@@ -9,6 +9,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <string.h>
#include <ctype.h>
#include <getopt.h>
@@ -31,7 +32,7 @@
* logical blocks.
*/
-static const char * version_str = "1.09 20151219";
+static const char * version_str = "1.10 20160201";
#define DEF_TIMEOUT_SECS 60
@@ -252,7 +253,8 @@ build_joint_arr(const char * file_name, uint64_t * lba_arr, uint32_t * num_arr,
{
char line[1024];
int off = 0;
- int in_len, k, j, m, have_stdin, ind, bit0;
+ int in_len, k, j, m, ind, bit0;
+ bool have_stdin;
char * lcp;
FILE * fp;
int64_t ll;
@@ -263,7 +265,7 @@ build_joint_arr(const char * file_name, uint64_t * lba_arr, uint32_t * num_arr,
else {
fp = fopen(file_name, "r");
if (NULL == fp) {
- pr2serr("build_joint_arr: unable to open %s\n", file_name);
+ pr2serr("%s: unable to open %s\n", __func__, file_name);
return 1;
}
}
@@ -291,9 +293,9 @@ build_joint_arr(const char * file_name, uint64_t * lba_arr, uint32_t * num_arr,
continue;
k = strspn(lcp, "0123456789aAbBcCdDeEfFhHxXiIkKmMgGtTpP ,\t");
if ((k < in_len) && ('#' != lcp[k])) {
- pr2serr("build_joint_arr: syntax error at line %d, pos %d\n",
- j + 1, m + k + 1);
- return 1;
+ pr2serr("%s: syntax error at line %d, pos %d\n", __func__, j + 1,
+ m + k + 1);
+ goto bad_exit;
}
for (k = 0; k < 1024; ++k) {
ll = sg_get_llnum(lcp);
@@ -301,15 +303,15 @@ build_joint_arr(const char * file_name, uint64_t * lba_arr, uint32_t * num_arr,
ind = ((off + k) >> 1);
bit0 = 0x1 & (off + k);
if (ind >= max_arr_len) {
- pr2serr("build_joint_arr: array length exceeded\n");
- return 1;
+ pr2serr("%s: array length exceeded\n", __func__);
+ goto bad_exit;
}
if (bit0) {
if (ll > UINT32_MAX) {
- pr2serr("build_joint_arr: number exceeds 32 bits in "
- "line %d, at pos %d\n", j + 1,
+ pr2serr("%s: number exceeds 32 bits in line %d, at "
+ "pos %d\n", __func__, j + 1,
(int)(lcp - line + 1));
- return 1;
+ goto bad_exit;
}
num_arr[ind] = (uint32_t)ll;
} else
@@ -325,20 +327,27 @@ build_joint_arr(const char * file_name, uint64_t * lba_arr, uint32_t * num_arr,
--k;
break;
}
- pr2serr("build_joint_arr: error on line %d, at pos %d\n",
- j + 1, (int)(lcp - line + 1));
- return 1;
+ pr2serr("%s: error on line %d, at pos %d\n", __func__, j + 1,
+ (int)(lcp - line + 1));
+ goto bad_exit;
}
}
off += (k + 1);
}
if (0x1 & off) {
- pr2serr("build_joint_arr: expect LBA,NUM pairs but decoded odd "
- "number\n from %s\n", have_stdin ? "stdin" : file_name);
- return 1;
+ pr2serr("%s: expect LBA,NUM pairs but decoded odd number\n from "
+ "%s\n", __func__, have_stdin ? "stdin" : file_name);
+ goto bad_exit;
}
*arr_len = off >> 1;
+ if (fp && (stdin != fp))
+ fclose(fp);
return 0;
+
+bad_exit:
+ if (fp && (stdin != fp))
+ fclose(fp);
+ return 1;
}