/* * grpunconv - update /etc/group with information from /etc/gshadow. * * Copyright (C) 1996, Michael Meskes * using sources from Marek Michalkiewicz * * This program may be freely used and distributed. If you improve * it, please send me your changes. Thanks! */ #include #ident "$Id: grpunconv.c,v 1.17 2005/08/31 17:25:00 kloczek Exp $" #include #include #include #include #include #include #include #include "prototypes.h" #ifdef SHADOWGRP #include "groupio.h" #include "sgroupio.h" /* * Global variables */ static int group_locked = 0; static int gshadow_locked = 0; /* local function prototypes */ static void fail_exit (int); static void fail_exit (int status) { if (group_locked) gr_unlock (); if (gshadow_locked) sgr_unlock (); exit (status); } int main (int argc, char **argv) { const struct group *gr; struct group grent; const struct sgrp *sg; char *Prog = argv[0]; setlocale (LC_ALL, ""); bindtextdomain (PACKAGE, LOCALEDIR); textdomain (PACKAGE); if (!sgr_file_present ()) exit (0); /* no /etc/gshadow, nothing to do */ if (!gr_lock ()) { fprintf (stderr, _("%s: can't lock group file\n"), Prog); fail_exit (5); } group_locked++; if (!gr_open (O_RDWR)) { fprintf (stderr, _("%s: can't open group file\n"), Prog); fail_exit (1); } if (!sgr_lock ()) { fprintf (stderr, _("%s: can't lock shadow group file\n"), Prog); fail_exit (5); } gshadow_locked++; if (!sgr_open (O_RDWR)) { fprintf (stderr, _("%s: can't open shadow group file\n"), Prog); fail_exit (1); } /* * Update group passwords if non-shadow password is "x". */ gr_rewind (); while ((gr = gr_next ())) { sg = sgr_locate (gr->gr_name); if (sg && strcmp (gr->gr_passwd, SHADOW_PASSWD_STRING) == 0) { /* add password to /etc/group */ grent = *gr; grent.gr_passwd = sg->sg_passwd; if (!gr_update (&grent)) { fprintf (stderr, _ ("%s: can't update entry for group %s\n"), Prog, grent.gr_name); fail_exit (3); } } } if (!sgr_close ()) { fprintf (stderr, _("%s: can't update shadow group file\n"), Prog); fail_exit (3); } if (!gr_close ()) { fprintf (stderr, _("%s: can't update group file\n"), Prog); fail_exit (3); } if (unlink (SGROUP_FILE) != 0) { fprintf (stderr, _("%s: can't delete shadow group file\n"), Prog); fail_exit (3); } sgr_unlock (); gr_unlock (); nscd_flush_cache ("group"); return 0; } #else /* !SHADOWGRP */ int main (int argc, char **argv) { fprintf (stderr, "%s: not configured for shadow group support.\n", argv[0]); exit (1); } #endif /* !SHADOWGRP */