static enum nss_status
internal_setgrent (ent_t *ent)
{
  enum nss_status status = NSS_STATUS_SUCCESS;

  ent->files = TRUE;

  if (ni == NULL)
    init_nss_interface ();

  if (ent->blacklist.data != NULL)
    {
      ent->blacklist.current = 1;
      ent->blacklist.data[0] = '|';
      ent->blacklist.data[1] = '\0';
    }
  else
    ent->blacklist.current = 0;

  ent->stream = fopen ("/etc/group", "rm");

  if (ent->stream == NULL)
    status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
  else
    {
      /* We have to make sure the file is  `closed on exec'.  */
      int result, flags;

      result = flags = fcntl (fileno_unlocked (ent->stream), F_GETFD, 0);
      if (result >= 0)
	{
	  flags |= FD_CLOEXEC;
	  result = fcntl (fileno_unlocked (ent->stream), F_SETFD, flags);
	}
      if (result < 0)
	{
	  /* Something went wrong.  Close the stream and return a
	     failure.  */
	  fclose (ent->stream);
	  ent->stream = NULL;
	  status = NSS_STATUS_UNAVAIL;
	}
      else
	/* We take care of locking ourself.  */
	__fsetlocking (ent->stream, FSETLOCKING_BYCALLER);
    }

  return status;
}
Пример #2
0
void ConfigurationLoad(const char *config_file){
#define SET_CONFIGURATION_VALUE()	({SetConfig(key,value);		\
				free(key);										\
				free(value);									\
				key=malloc(sizeof(char));						\
				*key=0;											\
				value=malloc(sizeof(char));						\
				*value=0;})
	FILE *f=fopen(config_file,"r");
	if(!f){
		perror("ConfigurationLoad");
		exit(1);
	}
	int fd=fileno_unlocked(f);
	fcntl(fd, F_SETFD, fcntl(fd, F_GETFL, 0)|FD_CLOEXEC);
	char ch=fgetc(f);
	char state=CONFIG_STATE_KEY;
	char *key=malloc(sizeof(char));
	*key=0;
	char *value=malloc(sizeof(char));
	*key=0;
	while(ch && ch!=EOF){
		if(ch=='\n'){
			SET_CONFIGURATION_VALUE();
			state=CONFIG_STATE_KEY;
		}else if(ch=='#'){
			state=CONFIG_STATE_COMMENT;
		}else if(state==CONFIG_STATE_KEY){
			if(ch==':'){
				state=CONFIG_STATE_VALUE;
			}else{
				StrAppend(&key,ch);
			}
		}else if(state==CONFIG_STATE_VALUE){
			if(ch=='\\'){
				ch=fgetc(f);
				if(ch!=EOF && ch!='\0')
					StrAppend(&value, ch);
			}else if(ch=='$'){
				char *env_key=malloc(sizeof(char));
				*env_key=0;
				while((ch=fgetc(f)) && ch!=EOF && (isalnum(ch)||ch=='_')){
					StrAppend(&env_key,ch);
				}
				ungetc(ch,f);
				for(char *env_value=getenv(env_key);*env_value;env_value++){
					StrAppend(&value,*env_value);
				}
				free(env_key);
			}else if(ch=='`'){
				char *cmd=calloc(1,1);
				while((ch=fgetc(f)) && ch!=EOF && ch!='`'){
					if(ch=='\\')
						StrAppend(&cmd, fgetc(f));
					else
						StrAppend(&cmd, ch);
				}
				AddCmdToValue(&value, cmd);
				free(cmd);
			}else{
				StrAppend(&value,ch);
			}
		}
		ch=fgetc(f);
	}
	if(state==CONFIG_STATE_VALUE){
		SET_CONFIGURATION_VALUE();
	}
	free(key);
	free(value);
}