forked from pool/multipath-tools
124 lines
2.8 KiB
Plaintext
124 lines
2.8 KiB
Plaintext
|
From 244454da2d4f3cb5d197a6b0e6fc2b4c8d72d08c Mon Sep 17 00:00:00 2001
|
||
|
From: Christophe Varoqui <christophe.varoqui@free.fr>
|
||
|
Date: Mon, 29 Sep 2008 00:44:46 +0200
|
||
|
Subject: [PATCH] [libmultipath] fixes for "show paths format"
|
||
|
|
||
|
o undue 1-char rollback when encountering unknown wildcard
|
||
|
o fix segfault when format starts with an unknown wildard
|
||
|
o continue parsing the format after an unknown wildcard
|
||
|
---
|
||
|
libmultipath/print.c | 33 +++++++++++++--------------------
|
||
|
1 files changed, 13 insertions(+), 20 deletions(-)
|
||
|
|
||
|
diff --git a/libmultipath/print.c b/libmultipath/print.c
|
||
|
index 459b973..7411ccc 100644
|
||
|
--- a/libmultipath/print.c
|
||
|
+++ b/libmultipath/print.c
|
||
|
@@ -28,6 +28,9 @@
|
||
|
#define NOPAD s = c
|
||
|
#define PAD(x) while ((int)(c - s) < (x) && (c < (line + len - 1))) \
|
||
|
*c++ = ' '; s = c
|
||
|
+#define ENDLINE \
|
||
|
+ if (c > line) \
|
||
|
+ line[c - line - 1] = '\n'
|
||
|
#define PRINT(var, size, format, args...) \
|
||
|
fwd = snprintf(var, size, format, ##args); \
|
||
|
c += (fwd >= size) ? size : fwd;
|
||
|
@@ -532,15 +535,13 @@ snprint_multipath_header (char * line, int len, char * format)
|
||
|
f++;
|
||
|
|
||
|
if (!(data = mpd_lookup(*f)))
|
||
|
- break; /* unknown wildcard */
|
||
|
+ continue; /* unknown wildcard */
|
||
|
|
||
|
PRINT(c, TAIL, data->header);
|
||
|
PAD(data->width);
|
||
|
} while (*f++);
|
||
|
|
||
|
- line[c - line - 1] = '\n';
|
||
|
- line[c - line] = '\0';
|
||
|
-
|
||
|
+ ENDLINE;
|
||
|
return (c - line);
|
||
|
}
|
||
|
|
||
|
@@ -567,7 +568,7 @@ snprint_multipath (char * line, int len, char * format,
|
||
|
f++;
|
||
|
|
||
|
if (!(data = mpd_lookup(*f)))
|
||
|
- break;
|
||
|
+ continue;
|
||
|
|
||
|
data->snprint(buff, MAX_FIELD_LEN, mpp);
|
||
|
PRINT(c, TAIL, buff);
|
||
|
@@ -575,9 +576,7 @@ snprint_multipath (char * line, int len, char * format,
|
||
|
buff[0] = '\0';
|
||
|
} while (*f++);
|
||
|
|
||
|
- line[c - line - 1] = '\n';
|
||
|
- line[c - line] = '\0';
|
||
|
-
|
||
|
+ ENDLINE;
|
||
|
return (c - line);
|
||
|
}
|
||
|
|
||
|
@@ -602,15 +601,13 @@ snprint_path_header (char * line, int len, char * format)
|
||
|
f++;
|
||
|
|
||
|
if (!(data = pd_lookup(*f)))
|
||
|
- break; /* unknown wildcard */
|
||
|
+ continue; /* unknown wildcard */
|
||
|
|
||
|
PRINT(c, TAIL, data->header);
|
||
|
PAD(data->width);
|
||
|
} while (*f++);
|
||
|
|
||
|
- line[c - line - 1] = '\n';
|
||
|
- line[c - line] = '\0';
|
||
|
-
|
||
|
+ ENDLINE;
|
||
|
return (c - line);
|
||
|
}
|
||
|
|
||
|
@@ -637,16 +634,14 @@ snprint_path (char * line, int len, char * format,
|
||
|
f++;
|
||
|
|
||
|
if (!(data = pd_lookup(*f)))
|
||
|
- break;
|
||
|
+ continue;
|
||
|
|
||
|
data->snprint(buff, MAX_FIELD_LEN, pp);
|
||
|
PRINT(c, TAIL, buff);
|
||
|
PAD(data->width);
|
||
|
} while (*f++);
|
||
|
|
||
|
- line[c - line - 1] = '\n';
|
||
|
- line[c - line] = '\0';
|
||
|
-
|
||
|
+ ENDLINE;
|
||
|
return (c - line);
|
||
|
}
|
||
|
|
||
|
@@ -673,16 +668,14 @@ snprint_pathgroup (char * line, int len, char * format,
|
||
|
f++;
|
||
|
|
||
|
if (!(data = pgd_lookup(*f)))
|
||
|
- break;
|
||
|
+ continue;
|
||
|
|
||
|
data->snprint(buff, MAX_FIELD_LEN, pgp);
|
||
|
PRINT(c, TAIL, buff);
|
||
|
PAD(data->width);
|
||
|
} while (*f++);
|
||
|
|
||
|
- line[c - line - 1] = '\n';
|
||
|
- line[c - line] = '\0';
|
||
|
-
|
||
|
+ ENDLINE;
|
||
|
return (c - line);
|
||
|
}
|
||
|
|
||
|
--
|
||
|
1.5.2.4
|
||
|
|