summaryrefslogtreecommitdiffhomepage
path: root/loginutils/addgroup.c
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2007-03-13 13:01:14 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2007-03-13 13:01:14 +0000
commit5df955fce2fbdc5b2acc365a120327ff943403da (patch)
tree41763239e81807259b7532aeef540ebc4804ce3d /loginutils/addgroup.c
parentc9c893d4f59418c50c8eb42bd80390026e123dd8 (diff)
Do not fail password check if shadow password does not exist -
fall back to ordinary one Reduced usage of functions returning datain static buffers. (mostly passwd/group/shadow related): function old new delta correct_password 143 193 +50 sulogin_main 490 533 +43 adduser_main 732 774 +42 passwd_main 1875 1915 +40 addgroup_main 330 365 +35 bb_internal_getspnam 38 - -38 bb_internal_fgetpwent 38 - -38 bb_internal_fgetgrent 38 - -38 static.resultbuf 168 88 -80 static.buffer 1872 1104 -768 ------------------------------------------------------------------------------ (add/remove: 0/3 grow/shrink: 5/2 up/down: 210/-962) Total: -752 bytes
Diffstat (limited to 'loginutils/addgroup.c')
-rw-r--r--loginutils/addgroup.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/loginutils/addgroup.c b/loginutils/addgroup.c
index 768d2c061..78250a418 100644
--- a/loginutils/addgroup.c
+++ b/loginutils/addgroup.c
@@ -15,35 +15,37 @@
* return 1 on failure */
static int group_study(struct group *g)
{
+ enum { max = 65000 };
FILE *etc_group;
gid_t desired;
-
- struct group *grp;
- const int max = 65000;
+ /* Using _r function to avoid static buffers pulled in */
+ char buffer[256];
+ struct group grp;
+ struct group *result;
etc_group = xfopen(bb_path_group_file, "r");
/* make sure gr_name isn't taken, make sure gid is kosher */
desired = g->gr_gid;
- while ((grp = fgetgrent(etc_group))) {
- if ((strcmp(grp->gr_name, g->gr_name)) == 0) {
+ while (!fgetgrent_r(etc_group, &grp, buffer, sizeof(buffer), &result)) {
+ if ((strcmp(grp.gr_name, g->gr_name)) == 0) {
bb_error_msg_and_die("%s: group already in use", g->gr_name);
}
- if ((desired) && grp->gr_gid == desired) {
+ if ((desired) && grp.gr_gid == desired) {
bb_error_msg_and_die("%d: gid already in use",
desired);
}
- if ((grp->gr_gid > g->gr_gid) && (grp->gr_gid < max)) {
- g->gr_gid = grp->gr_gid;
+ if ((grp.gr_gid > g->gr_gid) && (grp.gr_gid < max)) {
+ g->gr_gid = grp.gr_gid;
}
}
- fclose(etc_group);
+ if (ENABLE_FEATURE_CLEAN_UP)
+ fclose(etc_group);
/* gid */
+ g->gr_gid++;
if (desired) {
g->gr_gid = desired;
- } else {
- g->gr_gid++;
}
/* return 1; */
return 0;
@@ -65,12 +67,16 @@ static int addgroup(char *group, gid_t gid, const char *user)
file = xfopen(bb_path_group_file, "a");
/* group:passwd:gid:userlist */
fprintf(file, "%s:%s:%d:%s\n", group, "x", gr.gr_gid, user);
- fclose(file);
+ if (ENABLE_FEATURE_CLEAN_UP)
+ fclose(file);
#if ENABLE_FEATURE_SHADOWPASSWDS
- file = xfopen(bb_path_gshadow_file, "a");
- fprintf(file, "%s:!::\n", group);
- fclose(file);
+ file = fopen_or_warn(bb_path_gshadow_file, "a");
+ if (file) {
+ fprintf(file, "%s:!::\n", group);
+ if (ENABLE_FEATURE_CLEAN_UP)
+ fclose(file);
+ }
#endif
/* return 1; */
@@ -80,10 +86,8 @@ static int addgroup(char *group, gid_t gid, const char *user)
/*
* addgroup will take a login_name as its first parameter.
*
- * gid
- *
- * can be customized via command-line parameters.
- * ________________________________________________________________________ */
+ * gid can be customized via command-line parameters.
+ */
int addgroup_main(int argc, char **argv);
int addgroup_main(int argc, char **argv)
{
@@ -103,6 +107,5 @@ int addgroup_main(int argc, char **argv)
bb_error_msg_and_die(bb_msg_perm_denied_are_you_root);
}
- /* werk */
- return addgroup(argv[0], gid, (argv[1]) ? argv[1] : "");
+ return addgroup(argv[0], gid, argv[1] ? argv[1] : "");
}