static int read_db(struct database *db) { char *line = NULL; size_t linesz = 0; struct group *group = NULL, **pgroup = &db->groups; int linenr = 0; while (getline(&line, &linesz, db->fh) > 0) { char *s; s = strchr(line, '#'); if (s) { struct group *cmt; DB_NEW(cmt); *pgroup = cmt; pgroup = &cmt->next; cmt->comment = xstrdup(s + 1); *s = 0; } s = cleanline(line); linenr++; if (!s) continue; if (*s == '[') { int n; char *name; ++s; n = strcspn(s, "]"); if (s[n] == 0) goto parse_error; name = xalloc(n + 1); memcpy(name, s, n); group = alloc_group(name); *pgroup = group; pgroup = &group->next; } else { char *p; if (!group) goto parse_error; p = s + strcspn(s, ":"); if (*p != ':') goto parse_error; *p++ = 0; if (*p == ' ') p++; else goto parse_error; change_entry(db, group, line, p); } } if (ferror(db->fh)) { DBerror("IO error while reading database %s: %s\n", db->fn, strerror(errno)); goto error; } free(line); return 0; parse_error: DBerror("Parse error in database %s at line %d\n", db->fn, linenr); error: free(line); return -1; }
int get_stdin(char *args[]) { char buf[2], sbuf[ARGLEN], dbuf[ARGLEN], *arg1, *arg2; int x, y, z, argmax; memset(buf, 0, sizeof(buf)); argmax = ARGLEN - 1; arg1 = (char *)calloc(1, ARGLEN); arg2 = (char *)calloc(1, ARGLEN); memset(sbuf, 0, sizeof(sbuf)); memset(dbuf, 0, sizeof(dbuf)); while (!sbuf[0]) { x = 0; y = 0; memset(sbuf, 0, sizeof(sbuf)); do { x = read(0, buf, 1); if (x == 1) sbuf[y] = buf[0]; y++; } while (x > 0 && buf[0] != '\n' && y < ((int)sizeof(sbuf) - 1)); if (x < 0) { free(arg1); free(arg2); return -1; } if (!x) break; while (buf[0] != '\n' && x == 1) x = read(0, buf, 1); if (x < 0) { free(arg1); free(arg2); return -1; } if (!x) break; }; if (!sbuf[0]) { free(arg1); free(arg2); return -2; } x = cleanline(sbuf, dbuf); if (x < 1) { free(arg1); free(arg2); return x; } y = 0; while (y < (int)strlen(dbuf) && y < argmax && dbuf[y] != ' ') { arg1[y] = dbuf[y]; y++; } y++; z = 0; while (y < (int)strlen(dbuf) && z < argmax && dbuf[y] != ' ') { arg2[z] = dbuf[y]; y++; z++; } strlcpy(args[0], arg1, ARGLEN); strlcpy(args[1], arg2, ARGLEN); free(arg1); free(arg2); return x; }