#include "unit-name.h"
#include "path-util.h"
+/*
+ * Implements the logic described in
+ * http://freedesktop.org/wiki/Software/systemd/SystemUpdates
+ */
+
static const char *arg_dest = "/tmp";
static int generate_symlink(void) {
- struct stat st;
- char *p;
+ const char *p = NULL;
- if (lstat("/system-update", &st) < 0) {
+ if (access("/system-update", F_OK) < 0) {
if (errno == ENOENT)
return 0;
- log_error("Failed to check for system update: %m");
+ log_error_errno(errno, "Failed to check for system update: %m");
return -EINVAL;
}
- p = strappend(arg_dest, "/default.target");
- if (!p) {
- log_error("Out of memory.");
- return -ENOMEM;
- }
-
- if (symlink(SYSTEM_DATA_UNIT_PATH "/system-update.target", p) < 0) {
- free(p);
- log_error("Failed to create symlink: %m");
- return -errno;
- }
-
- free(p);
+ p = strappenda(arg_dest, "/default.target");
+ if (symlink(SYSTEM_DATA_UNIT_PATH "/system-update.target", p) < 0)
+ return log_error_errno(errno, "Failed to create symlink %s: %m", p);
return 0;
}
int main(int argc, char *argv[]) {
int r;
- if (argc > 2) {
- log_error("This program takes one or no arguments.");
+ if (argc > 1 && argc != 4) {
+ log_error("This program takes three or no arguments.");
return EXIT_FAILURE;
}
if (argc > 1)
- arg_dest = argv[1];
+ arg_dest = argv[2];
- log_set_target(LOG_TARGET_AUTO);
+ log_set_target(LOG_TARGET_SAFE);
log_parse_environment();
log_open();