int write_userconfig(char const * file) { int fd; int i, j; struct sbuf *buf; FILE *fp; if (file == NULL) file = _PATH_PW_CONF; if ((fd = open(file, O_CREAT|O_RDWR|O_TRUNC|O_EXLOCK, 0644)) == -1) return (0); if ((fp = fdopen(fd, "w")) == NULL) { close(fd); return (0); } buf = sbuf_new_auto(); for (i = _UC_NONE; i < _UC_FIELDS; i++) { int quote = 1; sbuf_clear(buf); switch (i) { case _UC_DEFAULTPWD: sbuf_cat(buf, boolean_str(config.default_password)); break; case _UC_REUSEUID: sbuf_cat(buf, boolean_str(config.reuse_uids)); break; case _UC_REUSEGID: sbuf_cat(buf, boolean_str(config.reuse_gids)); break; case _UC_NISPASSWD: sbuf_cat(buf, config.nispasswd ? config.nispasswd : ""); quote = 0; break; case _UC_DOTDIR: sbuf_cat(buf, config.dotdir ? config.dotdir : boolean_str(0)); break; case _UC_NEWMAIL: sbuf_cat(buf, config.newmail ? config.newmail : boolean_str(0)); break; case _UC_LOGFILE: sbuf_cat(buf, config.logfile ? config.logfile : boolean_str(0)); break; case _UC_HOMEROOT: sbuf_cat(buf, config.home); break; case _UC_HOMEMODE: sbuf_printf(buf, "%04o", config.homemode); quote = 0; break; case _UC_SHELLPATH: sbuf_cat(buf, config.shelldir); break; case _UC_SHELLS: for (j = 0; j < _UC_MAXSHELLS && system_shells[j] != NULL; j++) sbuf_printf(buf, "%s\"%s\"", j ? "," : "", system_shells[j]); quote = 0; break; case _UC_DEFAULTSHELL: sbuf_cat(buf, config.shell_default ? config.shell_default : bourne_shell); break; case _UC_DEFAULTGROUP: sbuf_cat(buf, config.default_group ? config.default_group : ""); break; case _UC_EXTRAGROUPS: for (j = 0; config.groups != NULL && j < (int)config.groups->sl_cur; j++) sbuf_printf(buf, "%s\"%s\"", j ? "," : "", config.groups->sl_str[j]); quote = 0; break; case _UC_DEFAULTCLASS: sbuf_cat(buf, config.default_class ? config.default_class : ""); break; case _UC_MINUID: sbuf_printf(buf, "%u", config.min_uid); quote = 0; break; case _UC_MAXUID: sbuf_printf(buf, "%u", config.max_uid); quote = 0; break; case _UC_MINGID: sbuf_printf(buf, "%u", config.min_gid); quote = 0; break; case _UC_MAXGID: sbuf_printf(buf, "%u", config.max_gid); quote = 0; break; case _UC_EXPIRE: sbuf_printf(buf, "%d", config.expire_days); quote = 0; break; case _UC_PASSWORD: sbuf_printf(buf, "%d", config.password_days); quote = 0; break; case _UC_NONE: break; } sbuf_finish(buf); if (comments[i]) fputs(comments[i], fp); if (*kwds[i]) { if (quote) fprintf(fp, "%s = \"%s\"\n", kwds[i], sbuf_data(buf)); else fprintf(fp, "%s = %s\n", kwds[i], sbuf_data(buf)); #if debugging printf("WROTE: %s = %s\n", kwds[i], sbuf_data(buf)); #endif } } sbuf_delete(buf); return (fclose(fp) != EOF); }
int write_userconfig(char const * file) { int fd; if (file == NULL) file = _PATH_PW_CONF; if ((fd = open(file, O_CREAT | O_RDWR | O_TRUNC | O_EXLOCK, 0644)) != -1) { FILE *fp; if ((fp = fdopen(fd, "w")) == NULL) close(fd); else { int i, j, k; int len = LNBUFSZ; char *buf = malloc(len); for (i = _UC_NONE; i < _UC_FIELDS; i++) { int quote = 1; char const *val = buf; *buf = '\0'; switch (i) { case _UC_DEFAULTPWD: val = boolean_str(config.default_password); break; case _UC_REUSEUID: val = boolean_str(config.reuse_uids); break; case _UC_REUSEGID: val = boolean_str(config.reuse_gids); break; case _UC_NISPASSWD: val = config.nispasswd ? config.nispasswd : ""; quote = 0; break; case _UC_DOTDIR: val = config.dotdir ? config.dotdir : boolean_str(0); break; case _UC_NEWMAIL: val = config.newmail ? config.newmail : boolean_str(0); break; case _UC_LOGFILE: val = config.logfile ? config.logfile : boolean_str(0); break; case _UC_HOMEROOT: val = config.home; break; case _UC_HOMEMODE: sprintf(buf, "%04o", config.homemode); quote = 0; break; case _UC_SHELLPATH: val = config.shelldir; break; case _UC_SHELLS: for (j = k = 0; j < _UC_MAXSHELLS && system_shells[j] != NULL; j++) { char lbuf[64]; int l = snprintf(lbuf, sizeof lbuf, "%s\"%s\"", k ? "," : "", system_shells[j]); if (l < 0) l = 0; if (l + k + 1 < len || extendline(&buf, &len, len + LNBUFSZ) != -1) { strcpy(buf + k, lbuf); k += l; } } quote = 0; break; case _UC_DEFAULTSHELL: val = config.shell_default ? config.shell_default : bourne_shell; break; case _UC_DEFAULTGROUP: val = config.default_group ? config.default_group : ""; break; case _UC_EXTRAGROUPS: extendarray(&config.groups, &config.numgroups, 200); for (j = k = 0; j < config.numgroups && config.groups[j] != NULL; j++) { char lbuf[64]; int l = snprintf(lbuf, sizeof lbuf, "%s\"%s\"", k ? "," : "", config.groups[j]); if (l < 0) l = 0; if (l + k + 1 < len || extendline(&buf, &len, len + 1024) != -1) { strcpy(buf + k, lbuf); k += l; } } quote = 0; break; case _UC_DEFAULTCLASS: val = config.default_class ? config.default_class : ""; break; case _UC_MINUID: sprintf(buf, "%lu", (unsigned long) config.min_uid); quote = 0; break; case _UC_MAXUID: sprintf(buf, "%lu", (unsigned long) config.max_uid); quote = 0; break; case _UC_MINGID: sprintf(buf, "%lu", (unsigned long) config.min_gid); quote = 0; break; case _UC_MAXGID: sprintf(buf, "%lu", (unsigned long) config.max_gid); quote = 0; break; case _UC_EXPIRE: sprintf(buf, "%d", config.expire_days); quote = 0; break; case _UC_PASSWORD: sprintf(buf, "%d", config.password_days); quote = 0; break; case _UC_NONE: break; } if (comments[i]) fputs(comments[i], fp); if (*kwds[i]) { if (quote) fprintf(fp, "%s = \"%s\"\n", kwds[i], val); else fprintf(fp, "%s = %s\n", kwds[i], val); #if debugging printf("WROTE: %s = %s\n", kwds[i], val); #endif } } free(buf); return fclose(fp) != EOF; } } return 0; }