Stefan Berger wrote:
Formatting errors in the previous posting (and another problem).
This is now hopefully the final version of this patch that adds support
for configuring 802.1Qbg and 802.1Qbh switches. The 802.1Qbh part has
been successfully tested with real hardware. The 802.1Qbg part has only
been tested with a (dummy) server that 'behaves' similarly to how we
expect lldpad to 'behave'.
V13:
- Merging Scott's v13-pre1 patch
- Fixing endptr related bug while using virStrToLong_ui() pointed out
by Jim Meyering
...
+static uint32_t
+getLldpadPid(void) {
+ int fd;
+ uint32_t pid = 0;
+
+ fd = open(LLDPAD_PID_FILE, O_RDONLY);
+ if (fd >= 0) {
+ char buffer[10];
+ char *endptr;
+
+ if (saferead(fd, buffer, sizeof(buffer)) <= sizeof(buffer)) {
+ unsigned int res;
+
+ if (virStrToLong_ui(buffer, &endptr, 10, &res) == 0
+ && (endptr == NULL || c_isspace(*endptr))
+ && res != 0) {
+ pid = res;
+ } else {
+ macvtapError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("error parsing pid of lldpad"));
+ }
+ }
+ } else {
+ virReportSystemError(errno,
+ _("Error opening file %s"), LLDPAD_PID_FILE);
+ }
+
+ if (fd >= 0)
+ close(fd);
+
+ return pid;
+}
Hi Stefan,
Sorry, but my suggestion was incomplete. *endptr == '\0' indicates
a valid conversion, too. That's what would happen if there's no byte
at all (not even a trailing newline) after the PID. In addition, when
virStrToLong_ui returns 0, endptr cannot be NULL, so there was no need
for that test. This handles it:
&& (*endptr == '\0' || c_isspace(*endptr))
With that, ACK.
A minor improvement: move the declarations of "buffer" and "endptr"
down into the if (saferead(... block alongside "res", since that's
the only scope in which they're used.
The rest looked fine, too -- but I don't know enough
to spot 802.1Qbx protocol bugs.
Jim
P.S. There are probably enough PID-reading blocks of
code like this that it'd be worth factoring this into
a function in util.c.