/* This file is in the public domain. */ #include #include #include #include "structs.h" #include "repo.h" void repo_free(REPO *r) { free(r->name); free(r->filename); if (r->f) fclose(r->f); free(r); } void repo_free_chain(REPO *chain) { REPO *r; while (chain) { r = chain; chain = r->link; repo_free(r); } } REPO *repo_lookup(LISTEN *l, const char *name, void (*err)(const char *, ...)) { MAP *m; int maxpri; int errpri; char *mapped; char *mstr; REPO *r; maxpri = -1; errpri = -1; for (m=l->mappings;m;m=m->link) { if (m->pri < maxpri) continue; switch ((*m->ops->match)(m->priv,name)) { case MATCH_NOMATCH: m->flags &= ~MF_MATCHED; break; case MATCH_MATCH: m->flags |= MF_MATCHED; maxpri = m->pri; break; case MATCH_ERROR: errpri = m->pri; break; default: abort(); break; } } if ((errpri >= 0) && (maxpri <= errpri)) { printf("error match\n"); // debugging (*err)("%s: bad repository name",name); } if (maxpri < 0) { printf("no matching mapping\n"); // debugging (*err)("%s: unmatched repository name",name); } mapped = 0; for (m=l->mappings;m;m=m->link) { if ((m->pri != maxpri) || !(m->flags & MF_MATCHED)) continue; mstr = (*m->ops->map)(m->priv,name); printf("mapped to %s\n",mstr); // debugging if (mapped && strcmp(mstr,mapped)) { printf("mapping conflict\n"); free(mapped); free(mstr); (*err)("%s: ambiguous repository name",name); } free(mapped); mapped = mstr; } if (! mapped) abort(); for (r=l->conf->repos;r;r=r->link) { if (! strcmp(mapped,r->name)) { printf("repo found\n"); // debugging return(r); } } printf("no repo found\n"); // debugging free(mapped); (*err)("%s: unknown repository name",name); abort(); } void repo_record(REPO *r, unsigned long long int ts, const char *data, void (*err)(const char *, ...)) { long long int iv; double dv; char *ep; char *ds; switch (r->type) { case DT_INT: iv = strtoll(data,&ep,0); if ((ep == data) || *ep) (*err)("invalid data"); asprintf(&ds,"%lld",iv); break; case DT_FLOAT: dv = strtod(data,&ep); if ((ep == data) || *ep) (*err)("invalid data"); asprintf(&ds,"%.20g",dv); break; default: abort(); break; } flock(fileno(r->f),LOCK_EX); fseek(r->f,0,SEEK_END); fprintf(r->f,"%llu %s\n",ts,ds); fflush(r->f); flock(fileno(r->f),LOCK_UN); }