1
0
multipath-tools/multipath-tools-fixes-for-show-paths-format

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