17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <bio.h>
47dd7cddfSDavid du Colombier
57dd7cddfSDavid du Colombier typedef struct Who Who;
67dd7cddfSDavid du Colombier struct Who
77dd7cddfSDavid du Colombier {
87dd7cddfSDavid du Colombier Who *next;
97dd7cddfSDavid du Colombier char *line;
107dd7cddfSDavid du Colombier char *name;
117dd7cddfSDavid du Colombier };
127dd7cddfSDavid du Colombier
cmp(void * arg1,void * arg2)137dd7cddfSDavid du Colombier int cmp(void *arg1, void *arg2)
147dd7cddfSDavid du Colombier {
157dd7cddfSDavid du Colombier Who **a = arg1, **b = arg2;
167dd7cddfSDavid du Colombier
177dd7cddfSDavid du Colombier return strcmp((*a)->name, (*b)->name);
187dd7cddfSDavid du Colombier }
197dd7cddfSDavid du Colombier
207dd7cddfSDavid du Colombier void
main(int argc,char ** argv)217dd7cddfSDavid du Colombier main(int argc, char **argv)
227dd7cddfSDavid du Colombier {
237dd7cddfSDavid du Colombier int changed, i, n;
247dd7cddfSDavid du Colombier Biobuf *b;
257dd7cddfSDavid du Colombier char *p, *name;
267dd7cddfSDavid du Colombier Who *first, *last, *w, *nw, **l;
277dd7cddfSDavid du Colombier
287dd7cddfSDavid du Colombier if(argc != 2){
297dd7cddfSDavid du Colombier fprint(2, "usage: auth/uniq file\n");
307dd7cddfSDavid du Colombier exits(0);
317dd7cddfSDavid du Colombier }
327dd7cddfSDavid du Colombier
337dd7cddfSDavid du Colombier last = first = 0;
347dd7cddfSDavid du Colombier b = Bopen(argv[1], OREAD);
357dd7cddfSDavid du Colombier if(b == 0)
367dd7cddfSDavid du Colombier exits(0);
377dd7cddfSDavid du Colombier
387dd7cddfSDavid du Colombier n = 0;
397dd7cddfSDavid du Colombier changed = 0;
407dd7cddfSDavid du Colombier while(p = Brdline(b, '\n')){
417dd7cddfSDavid du Colombier p[Blinelen(b)-1] = 0;
427dd7cddfSDavid du Colombier name = p;
437dd7cddfSDavid du Colombier while(*p && *p != '|')
447dd7cddfSDavid du Colombier p++;
457dd7cddfSDavid du Colombier if(*p)
467dd7cddfSDavid du Colombier *p++ = 0;
477dd7cddfSDavid du Colombier
487dd7cddfSDavid du Colombier for(nw = first; nw; nw = nw->next){
497dd7cddfSDavid du Colombier if(strcmp(nw->name, name) == 0){
507dd7cddfSDavid du Colombier free(nw->line);
517dd7cddfSDavid du Colombier nw->line = strdup(p);
527dd7cddfSDavid du Colombier changed = 1;
537dd7cddfSDavid du Colombier break;
547dd7cddfSDavid du Colombier }
557dd7cddfSDavid du Colombier }
567dd7cddfSDavid du Colombier if(nw)
577dd7cddfSDavid du Colombier continue;
587dd7cddfSDavid du Colombier
597dd7cddfSDavid du Colombier w = malloc(sizeof(Who));
607dd7cddfSDavid du Colombier if(w == 0){
61*d854de59SDavid du Colombier fprint(2, "auth/uniq: out of memory\n");
627dd7cddfSDavid du Colombier exits(0);
637dd7cddfSDavid du Colombier }
647dd7cddfSDavid du Colombier memset(w, 0, sizeof(Who));
657dd7cddfSDavid du Colombier w->name = strdup(name);
667dd7cddfSDavid du Colombier w->line = strdup(p);
677dd7cddfSDavid du Colombier if(first == 0)
687dd7cddfSDavid du Colombier first = w;
697dd7cddfSDavid du Colombier else
707dd7cddfSDavid du Colombier last->next = w;
717dd7cddfSDavid du Colombier last = w;
727dd7cddfSDavid du Colombier n++;
737dd7cddfSDavid du Colombier }
747dd7cddfSDavid du Colombier Bterm(b);
757dd7cddfSDavid du Colombier
767dd7cddfSDavid du Colombier l = malloc(n*sizeof(Who*));
777dd7cddfSDavid du Colombier for(i = 0, nw = first; nw; nw = nw->next, i++)
787dd7cddfSDavid du Colombier l[i] = nw;
797dd7cddfSDavid du Colombier qsort(l, n, sizeof(Who*), cmp);
807dd7cddfSDavid du Colombier
817dd7cddfSDavid du Colombier if(!changed)
827dd7cddfSDavid du Colombier exits(0);
837dd7cddfSDavid du Colombier
847dd7cddfSDavid du Colombier b = Bopen(argv[1], OWRITE);
857dd7cddfSDavid du Colombier if(b == 0){
867dd7cddfSDavid du Colombier fprint(2, "auth/uniq: can't open %s\n", argv[1]);
877dd7cddfSDavid du Colombier exits(0);
887dd7cddfSDavid du Colombier }
897dd7cddfSDavid du Colombier for(i = 0; i < n; i++)
907dd7cddfSDavid du Colombier Bprint(b, "%s|%s\n", l[i]->name, l[i]->line);
917dd7cddfSDavid du Colombier Bterm(b);
927dd7cddfSDavid du Colombier }
93