⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 group.c

📁 pwdutils是一套密码管理工具
💻 C
📖 第 1 页 / 共 2 页
字号:
	      retval = -1;              goto error_group;            }#ifdef WITH_SELINUX	  security_context_t prev_context;	  if (set_default_context (group_orig, &prev_context) < 0)	    {	      fclose (oldgf);	      retval = -1;	      goto error_group;	    }#endif	  /* Open a temp group file */	  newgf_fd = mkstemp (group_tmp);#ifdef WITH_SELINUX          if (restore_default_context (prev_context) < 0)	    {	      if (newgf_fd >= 0)		close (newgf_fd);	      fclose (oldgf);	      retval = -1;	      goto error_group;	    }#endif	  if (newgf_fd == -1)	    {	      fprintf (stderr, _("Can't create `%s': %m\n"),		       group_orig);	      fclose (oldgf);	      retval = -1;	      goto error_group;	    }          if (fchmod (newgf_fd, group_stat.st_mode) < 0)            {              fprintf (stderr,                       _("Cannot change permissions for `%s': %s\n"),                       group_tmp, strerror (errno));              fclose (oldgf);              close (newgf_fd);              unlink (group_tmp);              retval = -1;              goto error_group;            }          if (fchown (newgf_fd, group_stat.st_uid, group_stat.st_gid) < 0)	                {              fprintf (stderr,                       _("Cannot change owner/group for `%s': %s\n"),                       group_tmp, strerror (errno));              fclose (oldgf);              close (newgf_fd);              unlink (group_tmp);              retval = -1;              goto error_group;            }	  if (copy_xattr (group_orig, group_tmp) != 0)	    {	      fclose (oldgf);	      close (newgf_fd);	      unlink (group_tmp);	      retval = -1;	      goto error_group;	    }	  newgf = fdopen (newgf_fd, "w+");	  if (newgf == NULL)	    {	      fprintf (stderr, _("Can't open `%s': %m\n"), group_tmp);	      fclose (oldgf);	      close (newgf_fd);	      unlink (group_tmp);	      retval = -1;	      goto error_group;	    }	  gotit = 0;	  /* Loop over all group entries */	  while ((gr = fgetgrent (oldgf)) != NULL)	    {	      if (data->todo == DO_CREATE)		{		  /* insert the new group before we find a group with a		     higher GID or before we find a +/- character. */		  if (!gotit &&		      (/* data->gr.gr_gid < gr->gr_gid || XXX not yet? */		       gr->gr_name[0] == '+' ||		       gr->gr_name[0] == '-'))		    {		      /* write the group entry to tmp file */		      if (putgrent (&data->gr, newgf) < 0)			{			  fprintf (stderr,				   _("Error while writing `%s': %m\n"),                                   group_tmp);			  fclose (oldgf);			  fclose (newgf);			  retval = -1;			  goto error_group;			}		      gotit = 1;		    }		}	      else if (data->todo == DO_DELETE)		{		  if (data->gr.gr_gid == gr->gr_gid &&                      strcmp (data->gr.gr_name, gr->gr_name) == 0)                    {                      gotit = 1;                      continue;                    }		}	      else		{		  /* check if this is the gid we want to change. A few		     sanity checks added for consistency. */		  if (data->gr.gr_gid == gr->gr_gid &&		      !strcmp (data->gr.gr_name, gr->gr_name) && !gotit)		    {		      if (data->newpassword && !data->use_gshadow)			gr->gr_passwd = data->newpassword;		      if (data->new_gr_mem)			gr->gr_mem = data->new_gr_mem;		      if (data->have_new_gid)			gr->gr_gid = data->new_gid;		      if (data->new_name)			gr->gr_name = data->new_name;		      gotit = 1;		    }		}	      /* write the group entry to tmp file */	      if (putgrent (gr, newgf) < 0)		{		  fprintf (stderr,			   _("Error while writing `%s': %m\n"),                           group_tmp);		  fclose (oldgf);		  fclose (newgf);		  retval = -1;		  goto error_group;		}	    }	  if (data->todo == DO_CREATE && !gotit)	    {	      /* write the group entry to tmp file */	      if (putgrent (&data->gr, newgf) < 0)		{		  fprintf (stderr,			   _("Error while writing `%s': %m\n"),                           group_tmp);		  fclose (oldgf);		  fclose (newgf);		  retval = -1;		  goto error_group;		}	    }          else if (data->todo == DO_DELETE && !gotit)            {              fprintf (stderr,                       _("Group not found (and not deleted): %s\n"),                       data->gr.gr_name);              retval = -1;            }	  if (fclose (oldgf) != 0)	    {	      fprintf (stderr,		       _("Error while closing `%s': %m\n"), group_orig);	      fclose (newgf);	      retval = -1;	      goto error_group;	    }	  if (fclose (newgf) != 0)	    {	      fprintf (stderr,		       _("Error while closing `%s': %m\n"), group_tmp);	      retval = -1;	      goto error_group;	    }	  unlink (group_old);	  if (link (group_orig, group_old) < 0)	    fprintf (stderr,                     _("Warning: cannot create backup file `%s': %m\n"),		     group_old);	  if (rename (group_tmp, group_orig) < 0)	    {	      fprintf (stderr,                       _("Error while renaming `%s': %m\n"), group_tmp);              retval = -1;              goto error_group;            }	error_group:	  unlink (group_tmp);	}      if (!is_locked)	ulckpwdf ();    }#ifdef USE_LDAP  else if (data->service == S_LDAP)    {      ldap_session_t *session = NULL;      session = create_ldap_session (LDAP_PATH_CONF);      if (session == NULL)	retval = -1;      else	{	  if (data->todo == DO_CREATE)            {	      retval = ldap_create_group (session, &data->gr,					  data->binddn, data->oldclearpwd);            }          else if (data->todo == DO_DELETE)	    {	      retval = ldap_delete_group (session, data->gr.gr_name,					  data->binddn, data->oldclearpwd);	    }          else            {	      if (data->new_name)		{#if 0 /* XXX does not work */		  retval = ldap_update_group (session, data->gr.gr_name,					      data->binddn, data->oldclearpwd,					      LDAP_MOD_REPLACE, "cn",					      data->new_name);#else		  retval = -1;#endif		}	      if (data->have_new_gid)		{		  char *buf;		  if (asprintf (&buf, "%u", data->new_gid) < 1)		    {		      if (retval == 0)			retval = LDAP_OTHER;		    }		  else		    {		      int rc;		      rc = ldap_update_group (session, data->gr.gr_name,					      data->binddn, data->oldclearpwd,					      LDAP_MOD_REPLACE, "gidNumber",					      buf);		      free (buf);		      if (retval == 0 && rc != LDAP_SUCCESS)			retval = rc;		    }		}	      if (data->new_gr_mem)		{		  unsigned int i;		  /* At first, check if there is a new member and add this. */		  for (i = 0; data->new_gr_mem[i] != 0; i++)		    {		      unsigned int j;		      int found = 0;		      for (j = 0; data->gr.gr_mem[j]; j++)			{			  if (strcmp (data->new_gr_mem[i],				      data->gr.gr_mem[j]) == 0)			    {			      found = 1;			      break;			    }			}		      if (!found)			{			  int rc;			  rc = ldap_update_group (session, data->gr.gr_name,						  data->binddn,						  data->oldclearpwd,						  LDAP_MOD_ADD, "memberUid",						  data->new_gr_mem[i]);			  if (retval == 0 && rc != 0)			    retval = rc;			}		    }		  /* Now check, if there are entries missing and delete		     them.  */		  for (i = 0; data->gr.gr_mem[i] != 0; i++)		    {		      unsigned int j;		      int found = 0;		      for (j = 0; data->new_gr_mem[j]; j++)			{			  if (strcmp (data->gr.gr_mem[i],				      data->new_gr_mem[j]) == 0)			    {			      found = 1;			      break;			    }			}		      if (!found)			{			  int rc;			  rc = ldap_update_group (session, data->gr.gr_name,						  data->binddn,						  data->oldclearpwd,						  LDAP_MOD_DELETE, "memberUid",						  data->gr.gr_mem[i]);			  if (retval == 0 && rc != 0)			    retval = rc;			}		    }		}	    }	  if (retval != 0)	    fprintf (stderr,		     _("LDAP information update failed: %s\n"),		     ldap_err2string (retval));	  close_ldap_session (session);	}    }#endif  else if (data->service == S_YP)    {      fprintf (stderr, _("Cannot modify/add NIS group entries.\n"));      retval = -1;    }  else    {      fprintf (stderr, _("Unknown service %d.\n"), data->service);      retval = -1;    }  return retval;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -