shithub: svcfs

ref: ee36a9bdcdbaeb49fec609580da999a446b03684
dir: /buffer.c/

View raw version
#include <u.h>
#include <libc.h>
#include <fcall.h>
#include <thread.h>
#include <9p.h>

#include "svc.h"

static void
bufferFree(Buffer *match)
{
	if(match->name)
		free(match->name);
	free(match);
}

char *
bufferDrop(Buffer *base, char *name)
{
	Buffer *mp, *bp;
	qlock(&base->l);
	for(bp = base; bp->next; bp = bp->next){
		mp = bp->next;
		if(strcmp(bp->next->name, name) == 0){
			if(mp && mp->next)
				bp->next = mp->next;
			else
				bp->next = nil;
			if(mp)
				bufferFree(mp);
		}
	}
	qunlock(&base->l);			
	return nil;
}

char *
bufferPush(Buffer *base, char *name)
{
	Buffer *b, *ep;
	char p[1024];

	qlock(&base->l);
	for(ep = base; ep->next; ep = ep->next){
		if(ep && strcmp(ep->name, name) == 0){
			qunlock(&base->l);
			return "buffer exists";
		}
		if(ep->next == nil)
			break;
	}
	
	b = mallocz(sizeof(*b), 1);
	strcpy(b->name, name);
	b->notify = nil;
	b->unread = 0;
	b->tag = -1;
	b->rz.l = &b->l;
	snprint(p, sizeof(p), "%s/%s/%s", logdir, base->name, name);
	if(access(p, 0) == 0)
		b->fd = open(p, OWRITE);
	else
		b->fd = create(p, OWRITE, 0644);
	seek(b->fd, 0, 2);
	ep->next = b;
	qunlock(&base->l);
	return nil;
}

Buffer *
bufferSearch(Buffer *base, char *name)
{
	Buffer *sp;
	qlock(&base->l);
	for(sp = base; sp; sp = sp->next)
		if(strcmp(sp->name, name) == 0){
			qunlock(&base->l);
			return sp;
		}
	qunlock(&base->l);
	return nil;
}

Buffer *
bufferSearchTag(Buffer *base, ulong tag)
{
	Buffer *sp;
	qlock(&base->l);
	for(sp = base; sp; sp = sp->next)
		if(sp->tag == tag){
			qunlock(&base->l);
			return sp;
		}
	qunlock(&base->l);
	return nil;
}

Buffer*
bufferCreate(Channel *cmds, Channel *input)
{
	Buffer *b;

	b = mallocz(sizeof(*b), 1);
	b->cmds = cmds;
	b->input = input;
	b->tag = -1;
	b->unread = 0;
	b->notify = nil;
	b->next = nil;
	b->rz.l = &b->l;

	return b;
}