-
Notifications
You must be signed in to change notification settings - Fork 31
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ostree: move admindir to /etc/alternatives.admindir #135
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -566,6 +566,15 @@ static int fileExists(char *path) { | |
return !stat(path, &sbuf); | ||
} | ||
|
||
static int dirExists(char *path) { | ||
struct stat sbuf; | ||
|
||
if (stat(path, &sbuf)) | ||
return 0; | ||
|
||
return !!S_ISDIR(sbuf.st_mode); | ||
} | ||
|
||
static int facilityBelongsToUs(char *facility, const char *altDir) { | ||
char buf[PATH_MAX]; | ||
if (readlink(facility, buf, sizeof(buf)) <= 0) | ||
|
@@ -1321,6 +1330,10 @@ static int listServices(const char *altDir, const char *stateDir, int flags) { | |
return 0; | ||
} | ||
|
||
static int isOSTree() { | ||
return fileExists("/run/ostree-booted") || isLink("/ostree"); | ||
} | ||
|
||
int main(int argc, const char **argv) { | ||
const char **nextArg; | ||
char *end; | ||
|
@@ -1331,8 +1344,7 @@ int main(int argc, const char **argv) { | |
struct alternative newAlt = {-1, {NULL, NULL, NULL}, NULL, NULL, 0, NULL}; | ||
int flags = 0; | ||
char *altDir = "/etc/alternatives"; | ||
char *stateDir = "/var/lib/alternatives"; | ||
struct stat sb; | ||
char *stateDir= NULL; | ||
struct linkSet newSet = {NULL, NULL, NULL}; | ||
|
||
setlocale(LC_ALL, ""); | ||
|
@@ -1454,12 +1466,26 @@ int main(int argc, const char **argv) { | |
} | ||
} | ||
|
||
if (stat(altDir, &sb) || !S_ISDIR(sb.st_mode) || access(altDir, F_OK)) { | ||
if (!dirExists(altDir)) { | ||
fprintf(stderr, _("altdir %s invalid\n"), altDir); | ||
exit(2); | ||
} | ||
|
||
if (stat(stateDir, &sb) || !S_ISDIR(sb.st_mode) || access(stateDir, F_OK)) { | ||
// if the stateDir is not explicitly set, we will use /var/lib/alternatives on normal systems | ||
// and /etc/alternatives-admindir on OSTree systems, if the dir does not exist, we will create it | ||
// if the stateDir is explicitly set, we will *not* try to create the dir and fail immediately if it does not exist | ||
if (!stateDir) { | ||
stateDir = "/var/lib/alternatives"; | ||
if (!dirExists(stateDir)) { | ||
if (isOSTree()) | ||
stateDir = "/etc/alternatives-admindir"; | ||
|
||
if (mkdir(stateDir, 0755) < 0 && errno != EEXIST) { | ||
fprintf(stderr, _("failed to create admindir: %s\n"), strerror(errno)); | ||
exit(2); | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Best to do that just once after the whole There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I already talked about the acccess and I like performant code :-) |
||
} else if (!dirExists(stateDir)) { | ||
fprintf(stderr, _("admindir %s invalid\n"), stateDir); | ||
exit(2); | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The
access()
check should remain, I think.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We discussed this with @msekletar, and I don't think it is needed. With F_OK, it will just check if it exists, but that is already done through stat. If there had been W_OK, that would have been a different story.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
True... But then it'd be better to remove it in a separate commit.