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; }
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); }