Set errno and return -1 in public API calls like all other weston code
does. Most systemd+dbus calls return negative error-codes instead of -1
and setting errno. Thus, we need to explicitly set errno before returning.
Also note that we must set errno _after_ the cleanup path. Calling
functions like close() in the cleanup path might overwrite errno (which is
not what we want). So protect errno until the final return -1;
r = stat(path, &st);
if (r < 0)
- return -errno;
- if (!S_ISCHR(st.st_mode))
- return -ENODEV;
+ return -1;
+ if (!S_ISCHR(st.st_mode)) {
+ errno = ENODEV;
+ return -1;
+ }
fd = weston_logind_take_device(wl, major(st.st_rdev),
minor(st.st_rdev), NULL);
close(fd);
weston_logind_release_device(wl, major(st.st_rdev),
minor(st.st_rdev));
- return r;
+ errno = -r;
+ return -1;
}
WL_EXPORT void
r = ioctl(wl->vt, VT_ACTIVATE, vt);
if (r < 0)
- return -errno;
+ return -1;
return 0;
}
free(wl);
err_out:
weston_log("logind: cannot setup systemd-logind helper (%d), using legacy fallback\n", r);
- return r;
+ errno = -r;
+ return -1;
}
WL_EXPORT void