]> git.ipfire.org Git - thirdparty/shadow.git/commitdiff
Do not fail on missing files in /etc/, create them instead.
authorDimitri John Ledkov <dimitri.j.ledkov@intel.com>
Fri, 27 Feb 2015 13:17:25 +0000 (13:17 +0000)
committerDimitri John Ledkov <dimitri.j.ledkov@intel.com>
Fri, 27 Feb 2015 17:01:29 +0000 (17:01 +0000)
passwd, shadow, group, gshadow etc. can be managed via nss -
e.g. system default accounts can be specified using nss_altfiles,
rather than in /etc/. Thus despite having default accounts, these
files can be missing on disk and thus should be opened with O_CREATE
whenever they are attempted to be opened in O_RDWR modes.

21 files changed:
src/chage.c
src/chfn.c
src/chgpasswd.c
src/chpasswd.c
src/chsh.c
src/gpasswd.c
src/groupadd.c
src/groupdel.c
src/groupmems.c
src/groupmod.c
src/grpck.c
src/grpconv.c
src/grpunconv.c
src/newusers.c
src/passwd.c
src/pwck.c
src/pwconv.c
src/pwunconv.c
src/useradd.c
src/userdel.c
src/usermod.c

index 2df65a9490dc5edda95719c6ff33769ad75e6c1c..617e90f15a962b944cd3401dd6a98512731fbea4 100644 (file)
@@ -592,7 +592,7 @@ static void open_files (bool readonly)
                }
                pw_locked = true;
        }
-       if (pw_open (readonly ? O_RDONLY: O_RDWR) == 0) {
+       if (pw_open (readonly ? O_RDONLY: O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, pw_dbname ());
                SYSLOG ((LOG_WARN, "cannot open %s", pw_dbname ()));
                fail_exit (E_NOPERM);
@@ -613,7 +613,7 @@ static void open_files (bool readonly)
                }
                spw_locked = true;
        }
-       if (spw_open (readonly ? O_RDONLY: O_RDWR) == 0) {
+       if (spw_open (readonly ? O_RDONLY: O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, spw_dbname ());
                SYSLOG ((LOG_WARN, "cannot open %s", spw_dbname ()));
index a022c1a35354416431c22ff49929a08897523ded..18aa3de7b4d03a25090e26696eda4be6d26ba15d 100644 (file)
@@ -463,7 +463,7 @@ static void update_gecos (const char *user, char *gecos)
                fail_exit (E_NOPERM);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, pw_dbname ());
                fail_exit (E_NOPERM);
index 4dd5fbab11e421a4adae3275ac16d5e13703df28..13203a46d7f3bf4805a8b5a4e3e2b63a804efdfa 100644 (file)
@@ -316,7 +316,7 @@ static void open_files (void)
                fail_exit (1);
        }
        gr_locked = true;
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, gr_dbname ());
                fail_exit (1);
@@ -332,7 +332,7 @@ static void open_files (void)
                        fail_exit (1);
                }
                sgr_locked = true;
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr, _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
                        fail_exit (1);
index 78436d6a4454bb366e5d4c2f2cdfc50240debd45..21008f58cdf2bd68604dfdd88eae0e607d799429 100644 (file)
@@ -313,7 +313,7 @@ static void open_files (void)
                fail_exit (1);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, pw_dbname ());
                fail_exit (1);
@@ -328,7 +328,7 @@ static void open_files (void)
                        fail_exit (1);
                }
                spw_locked = true;
-               if (spw_open (O_RDWR) == 0) {
+               if (spw_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, spw_dbname ());
index 393a79ff353fd1c67f658f179083868668bbf96a..c89708b9222017ff23c2a1871db3d2b7b36a4899 100644 (file)
@@ -373,7 +373,7 @@ static void update_shell (const char *user, char *newshell)
                fail_exit (1);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, pw_dbname ());
                SYSLOG ((LOG_WARN, "cannot open %s", pw_dbname ()));
                fail_exit (1);
index 8959a35a1fee59a582a2ef1e6382d097492b3549..27ad9599c1123e21241622098099f656de542d3b 100644 (file)
@@ -370,7 +370,7 @@ static void open_files (void)
 
        add_cleanup (log_gpasswd_failure_system, NULL);
 
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
                         Prog, gr_dbname ());
@@ -380,7 +380,7 @@ static void open_files (void)
 
 #ifdef SHADOWGRP
        if (is_shadowgrp) {
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
index 39b4ec02fae0ed927762165d6a5299ea7067f1a7..179438fbcefac696e64552ec8d21860c3fb127ec 100644 (file)
@@ -346,7 +346,7 @@ static void open_files (void)
        add_cleanup (cleanup_report_add_group, group_name);
 
        /* And now open the databases */
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
                SYSLOG ((LOG_WARN, "cannot open %s", gr_dbname ()));
                exit (E_GRP_UPDATE);
@@ -354,7 +354,7 @@ static void open_files (void)
 
 #ifdef SHADOWGRP
        if (is_shadow_grp) {
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
index da993475b0158b01f89440b5a9b58ab30ad5f961..c64b6a7eade5be2166587070d00dc6c41ff1a4db 100644 (file)
@@ -246,7 +246,7 @@ static void open_files (void)
        add_cleanup (cleanup_report_del_group, group_name);
 
        /* An now open the databases */
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
                         Prog, gr_dbname ());
@@ -255,7 +255,7 @@ static void open_files (void)
        }
 #ifdef SHADOWGRP
        if (is_shadow_grp) {
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
index e4f107f93191e99ea6e0044a30e76248adc82ad5..4a49e10b28d1557488ec0f3943f00103641a94b9 100644 (file)
@@ -536,14 +536,14 @@ static void open_files (void)
 #endif
        }
 
-       if (gr_open (list ? O_RDONLY : O_RDWR) == 0) {
+       if (gr_open (list ? O_RDONLY : O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
                fail_exit (EXIT_GROUP_FILE);
        }
 
 #ifdef SHADOWGRP
        if (is_shadowgrp) {
-               if (sgr_open (list ? O_RDONLY : O_RDWR) == 0) {
+               if (sgr_open (list ? O_RDONLY : O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr, _("%s: cannot open %s\n"), Prog, sgr_dbname ());
                        fail_exit (EXIT_GROUP_FILE);
                }
index d9d3807175c8285a02b29b2196afedf4e52793af..757c1a40235d457ed469d45892e44a8bd2b83939 100644 (file)
@@ -663,7 +663,7 @@ static void lock_files (void)
  */
 static void open_files (void)
 {
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
                SYSLOG ((LOG_WARN, "cannot open %s", gr_dbname ()));
                exit (E_GRP_UPDATE);
@@ -672,7 +672,7 @@ static void open_files (void)
 #ifdef SHADOWGRP
        if (   is_shadow_grp
            && (pflg || nflg)) {
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
@@ -683,7 +683,7 @@ static void open_files (void)
 #endif                         /* SHADOWGRP */
 
        if (gflg) {
-               if (pw_open (O_RDWR) == 0) {
+               if (pw_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, pw_dbname ());
index 9d1ed9032dd1f2bfd492a7774cc9abfbfeb130ef..ea5d3b39eb034a52fcbd49f86a7b40740e0c60de 100644 (file)
@@ -299,7 +299,7 @@ static void open_files (void)
         * Open the files. Use O_RDONLY if we are in read_only mode,
         * O_RDWR otherwise.
         */
-       if (gr_open (read_only ? O_RDONLY : O_RDWR) == 0) {
+       if (gr_open (read_only ? O_RDONLY : O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog,
                         grp_file);
                if (use_system_grp_file) {
@@ -308,7 +308,7 @@ static void open_files (void)
                fail_exit (E_CANT_OPEN);
        }
 #ifdef SHADOWGRP
-       if (is_shadow && (sgr_open (read_only ? O_RDONLY : O_RDWR) == 0)) {
+       if (is_shadow && (sgr_open (read_only ? O_RDONLY : O_CREAT | O_RDWR) == 0)) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog,
                         sgr_file);
                if (use_system_sgr_file) {
index ece8095d7ce7b933c4636694bb6f27d4cd711256..f681f07fdcfb40fa6d9890fcc3605b2affc16327 100644 (file)
@@ -163,7 +163,7 @@ int main (int argc, char **argv)
                fail_exit (5);
        }
        gr_locked = true;
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
                fail_exit (1);
        }
index ea8914cb3bd2576aec6b2a1a828a3f3eb1b754c6..253f06f51f136e2227ef4995c9c9ac05eeb99d2a 100644 (file)
@@ -166,7 +166,7 @@ int main (int argc, char **argv)
                fail_exit (5);
        }
        gr_locked = true;
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, gr_dbname ());
                fail_exit (1);
index a90d04ee39f10902c7b5643550cd04811776c745..724cbb40a7f5307c0507dd8000da8aff685173ef 100644 (file)
@@ -805,27 +805,27 @@ static void open_files (void)
        }
 #endif                         /* ENABLE_SUBIDS */
 
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, pw_dbname ());
                fail_exit (EXIT_FAILURE);
        }
-       if (is_shadow && (spw_open (O_RDWR) == 0)) {
+       if (is_shadow && (spw_open (O_CREAT | O_RDWR) == 0)) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, spw_dbname ());
                fail_exit (EXIT_FAILURE);
        }
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
                fail_exit (EXIT_FAILURE);
        }
 #ifdef SHADOWGRP
-       if (is_shadow_grp && (sgr_open (O_RDWR) == 0)) {
+       if (is_shadow_grp && (sgr_open (O_CREAT | O_RDWR) == 0)) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, sgr_dbname ());
                fail_exit (EXIT_FAILURE);
        }
 #endif
 #ifdef ENABLE_SUBIDS
        if (is_sub_uid) {
-               if (sub_uid_open (O_RDWR) == 0) {
+               if (sub_uid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sub_uid_dbname ());
@@ -833,7 +833,7 @@ static void open_files (void)
                }
        }
        if (is_sub_gid) {
-               if (sub_gid_open (O_RDWR) == 0) {
+               if (sub_gid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sub_gid_dbname ());
index 3424f3bfedc9d40f7d7b9e1828f7d5eb26c161db..1191111d0d8a5600ab9b93c7769a02fc1f2a65bb 100644 (file)
@@ -573,7 +573,7 @@ static void update_noshadow (void)
                exit (E_PWDBUSY);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                (void) fprintf (stderr,
                                _("%s: cannot open %s\n"),
                                Prog, pw_dbname ());
@@ -627,7 +627,7 @@ static void update_shadow (void)
                exit (E_PWDBUSY);
        }
        spw_locked = true;
-       if (spw_open (O_RDWR) == 0) {
+       if (spw_open (O_CREAT | O_RDWR) == 0) {
                (void) fprintf (stderr,
                                _("%s: cannot open %s\n"),
                                Prog, spw_dbname ());
index 05df68ece8c679d9edb0688fa3661d4c4d2cfcc5..523135f63ac14d8561d6850bb6af2e981906237e 100644 (file)
@@ -281,7 +281,7 @@ static void open_files (void)
         * Open the files. Use O_RDONLY if we are in read_only mode, O_RDWR
         * otherwise.
         */
-       if (pw_open (read_only ? O_RDONLY : O_RDWR) == 0) {
+       if (pw_open (read_only ? O_RDONLY : O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"),
                         Prog, pw_dbname ());
                if (use_system_pw_file) {
@@ -290,7 +290,7 @@ static void open_files (void)
                fail_exit (E_CANTOPEN);
        }
        if (is_shadow && !use_tcb) {
-               if (spw_open (read_only ? O_RDONLY : O_RDWR) == 0) {
+               if (spw_open (read_only ? O_RDONLY : O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr, _("%s: cannot open %s\n"),
                                 Prog, spw_dbname ());
                        if (use_system_spw_file) {
@@ -566,7 +566,7 @@ static void check_pw_file (int *errors, bool *changed)
                                        continue;
                                }
                                spw_locked = true;
-                               if (spw_open (read_only ? O_RDONLY : O_RDWR) == 0) {
+                               if (spw_open (read_only ? O_RDONLY : O_CREAT | O_RDWR) == 0) {
                                        fprintf (stderr,
                                                 _("%s: cannot open %s\n"),
                                                 Prog, spw_dbname ());
index d41d5dd299aa6b6ac45f13a7c5c070547b081192..e2d61f875dc7e1cc9fa4496449f31a89aa7c1323 100644 (file)
@@ -200,7 +200,7 @@ int main (int argc, char **argv)
                fail_exit (E_PWDBUSY);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, pw_dbname ());
                fail_exit (E_MISSING);
index 62e2af0475cd55c4243730437c0b2a1910d6e1a2..fabf02376389323f4164506baf279e66aaed59df 100644 (file)
@@ -166,7 +166,7 @@ int main (int argc, char **argv)
                fail_exit (5);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
                         Prog, pw_dbname ());
index 1b65bf449c4edab815429a99babb85b42f2fff52..31ea584525159074dcede49ff5a34b444052850d 100644 (file)
@@ -1537,7 +1537,7 @@ static void open_files (void)
                exit (E_PW_UPDATE);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, pw_dbname ());
                fail_exit (E_PW_UPDATE);
        }
@@ -1554,7 +1554,7 @@ static void open_files (void)
                fail_exit (E_GRP_UPDATE);
        }
        gr_locked = true;
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
                fail_exit (E_GRP_UPDATE);
        }
@@ -1567,7 +1567,7 @@ static void open_files (void)
                        fail_exit (E_GRP_UPDATE);
                }
                sgr_locked = true;
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
@@ -1584,7 +1584,7 @@ static void open_files (void)
                        fail_exit (E_SUB_UID_UPDATE);
                }
                sub_uid_locked = true;
-               if (sub_uid_open (O_RDWR) == 0) {
+               if (sub_uid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sub_uid_dbname ());
@@ -1599,7 +1599,7 @@ static void open_files (void)
                        fail_exit (E_SUB_GID_UPDATE);
                }
                sub_gid_locked = true;
-               if (sub_gid_open (O_RDWR) == 0) {
+               if (sub_gid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sub_gid_dbname ());
@@ -1621,7 +1621,7 @@ static void open_shadow (void)
                fail_exit (E_PW_UPDATE);
        }
        spw_locked = true;
-       if (spw_open (O_RDWR) == 0) {
+       if (spw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
                         Prog, spw_dbname ());
index 19b12bc459e895f03b62df5f862492a13edf8906..9092b5c1a532fffaa48b7cd76d6e4a2391ce891a 100644 (file)
@@ -565,7 +565,7 @@ static void open_files (void)
                fail_exit (E_PW_UPDATE);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"), Prog, pw_dbname ());
 #ifdef WITH_AUDIT
@@ -590,7 +590,7 @@ static void open_files (void)
                        fail_exit (E_PW_UPDATE);
                }
                spw_locked = true;
-               if (spw_open (O_RDWR) == 0) {
+               if (spw_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, spw_dbname ());
@@ -616,7 +616,7 @@ static void open_files (void)
                fail_exit (E_GRP_UPDATE);
        }
        gr_locked = true;
-       if (gr_open (O_RDWR) == 0) {
+       if (gr_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr, _("%s: cannot open %s\n"), Prog, gr_dbname ());
 #ifdef WITH_AUDIT
                audit_logger (AUDIT_DEL_USER, Prog,
@@ -641,7 +641,7 @@ static void open_files (void)
                        fail_exit (E_GRP_UPDATE);
                }
                sgr_locked= true;
-               if (sgr_open (O_RDWR) == 0) {
+               if (sgr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr, _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
 #ifdef WITH_AUDIT
@@ -669,7 +669,7 @@ static void open_files (void)
                        fail_exit (E_SUB_UID_UPDATE);
                }
                sub_uid_locked = true;
-               if (sub_uid_open (O_RDWR) == 0) {
+               if (sub_uid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                _("%s: cannot open %s\n"), Prog, sub_uid_dbname ());
 #ifdef WITH_AUDIT
@@ -695,7 +695,7 @@ static void open_files (void)
                        fail_exit (E_SUB_GID_UPDATE);
                }
                sub_gid_locked = true;
-               if (sub_gid_open (O_RDWR) == 0) {
+               if (sub_gid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                _("%s: cannot open %s\n"), Prog, sub_gid_dbname ());
 #ifdef WITH_AUDIT
index aa4c2621deba860122a2c34ef25dcd25e67bcfa8..25edd1f2e868bcb5281b111c11d75621ed659ee7 100644 (file)
@@ -1532,7 +1532,7 @@ static void open_files (void)
                fail_exit (E_PW_UPDATE);
        }
        pw_locked = true;
-       if (pw_open (O_RDWR) == 0) {
+       if (pw_open (O_CREAT | O_RDWR) == 0) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
                         Prog, pw_dbname ());
@@ -1545,7 +1545,7 @@ static void open_files (void)
                fail_exit (E_PW_UPDATE);
        }
        spw_locked = true;
-       if (is_shadow_pwd && (spw_open (O_RDWR) == 0)) {
+       if (is_shadow_pwd && (spw_open (O_CREAT | O_RDWR) == 0)) {
                fprintf (stderr,
                         _("%s: cannot open %s\n"),
                         Prog, spw_dbname ());
@@ -1564,7 +1564,7 @@ static void open_files (void)
                        fail_exit (E_GRP_UPDATE);
                }
                gr_locked = true;
-               if (gr_open (O_RDWR) == 0) {
+               if (gr_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, gr_dbname ());
@@ -1578,7 +1578,7 @@ static void open_files (void)
                        fail_exit (E_GRP_UPDATE);
                }
                sgr_locked = true;
-               if (is_shadow_grp && (sgr_open (O_RDWR) == 0)) {
+               if (is_shadow_grp && (sgr_open (O_CREAT | O_RDWR) == 0)) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sgr_dbname ());
@@ -1595,7 +1595,7 @@ static void open_files (void)
                        fail_exit (E_SUB_UID_UPDATE);
                }
                sub_uid_locked = true;
-               if (sub_uid_open (O_RDWR) == 0) {
+               if (sub_uid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sub_uid_dbname ());
@@ -1610,7 +1610,7 @@ static void open_files (void)
                        fail_exit (E_SUB_GID_UPDATE);
                }
                sub_gid_locked = true;
-               if (sub_gid_open (O_RDWR) == 0) {
+               if (sub_gid_open (O_CREAT | O_RDWR) == 0) {
                        fprintf (stderr,
                                 _("%s: cannot open %s\n"),
                                 Prog, sub_gid_dbname ());