/* Copyright (c) 2014 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * #s (srv) - a chan sharing service.  This was originally based off the Inferno
 * #s, but it's been completely rewritten to act like what I remember the plan9
 * one to be like.
 *
 *
 * I tried a style where we hang reference counted objects off c->aux, specific
 * to each chan.  Instead of looking up via qid.path, we just look at the c->aux
 * for our struct.  I originally tried having those be reference counted
 * structs, but that fails for a bunch of reasons.  Without them being reference
 * counted, we're really just using c->aux as if it was qid.path.
 *
 * We can't hang an external reference to an item off c->aux, and have that item
 * change as we gen (but we can use it as a weak ref, uncounted ref).  The main
 * thing is that devclone makes a 'half-chan' with a copy of c->aux.  This chan
 * may or may not be closed later.  If we transfer refs via a gen, we first
 * assumed we had a ref in the first place (devclone doesn't incref our srv),
 * and then we might not close.  This ends up decreffing top_dir too much, and
 * giving it's refs to some other file in the walk. */

#include <vfs.h>
#include <kfs.h>
#include <slab.h>
#include <kmalloc.h>
#include <kref.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <error.h>
#include <cpio.h>
#include <pmap.h>
#include <smp.h>
#include <ip.h>
#include <sys/queue.h>

struct dev srvdevtab;

static char *devname(void)
{
	return srvdevtab.name;
}

#define Qtopdir			1
#define Qsrvfile		2

struct srvfile {
	TAILQ_ENTRY(srvfile) link;
	char *name;
	struct chan *chan;
	struct kref ref;			/* +1 for existing on create, -1 on remove */
	char *user;
	uint32_t perm;
	atomic_t opens;				/* used for exclusive open checks */
};

struct srvfile *top_dir;
TAILQ_HEAD(srvfilelist, srvfile) srvfiles = TAILQ_HEAD_INITIALIZER(srvfiles);
/* the lock protects the list and its members.  we don't incref from a list ref
 * without the lock. (if you're on the list, we can grab a ref). */
spinlock_t srvlock = SPINLOCK_INITIALIZER;

atomic_t nr_srvs = 0;			/* debugging - concerned about leaking mem */

/* Given a pointer (internal ref), we attempt to get a kref */
static bool grab_ref(struct srvfile *srv)
{
	bool ret = FALSE;
	struct srvfile *srv_i;
	spin_lock(&srvlock);
	TAILQ_FOREACH(srv_i, &srvfiles, link) {
		if (srv_i == srv) {
			ret = kref_get_not_zero(&srv_i->ref, 1);
			break;
		}
	}
	spin_unlock(&srvlock);
	return ret;
}

static void srv_release(struct kref *kref)
{
	struct srvfile *srv = container_of(kref, struct srvfile, ref);
	kfree(srv->user);
	kfree(srv->name);
	if (srv->chan)
		cclose(srv->chan);
	kfree(srv);
	atomic_dec(&nr_srvs);
}

static int srvgen(struct chan *c, char *name, struct dirtab *tab,
				  int ntab, int s, struct dir *dp)
{
	struct srvfile *prev, *next;
	struct qid q;

	if (s == DEVDOTDOT) {
		/* changing whatever c->aux was to be topdir */
		mkqid(&q, Qtopdir, 0, QTDIR);
		devdir(c, q, devname(), 0, eve, 0555, dp);
		return 1;
	}
	spin_lock(&srvlock);
	TAILQ_FOREACH(next, &srvfiles, link) {
		/* come in with s == 0 on the first run */
		if (s-- == 0)
			break;
	}
	if (!next) {
		spin_unlock(&srvlock);
		return -1;
	}
	/* update c to point to our new srvfile.  this keeps the chan and its srv in
	 * sync with what we're genning. */
	c->aux = next;	/* uncounted ref */
	mkqid(&q, Qsrvfile, 0, QTFILE);
	/* once we release the lock, next could disappear, including next->name */
	strlcpy(get_cur_genbuf(), next->name, GENBUF_SZ);
	devdir(c, q, get_cur_genbuf(), 1 /* length */ , next->user, next->perm, dp);
	spin_unlock(&srvlock);
	return 1;
}

static void __srvinit(void)
{
	top_dir = kzmalloc(sizeof(struct srvfile), MEM_WAIT);
	/* kstrdup, just in case we free this later */
	kstrdup(&top_dir->name, "srv");
	kstrdup(&top_dir->user, current ? current->user : "eve");
	top_dir->perm = DMDIR | 0770;
	/* +1 for existing, should never decref this */
	kref_init(&top_dir->ref, fake_release, 1);
	atomic_set(&top_dir->opens, 0);
}

static void srvinit(void)
{
	run_once(__srvinit());
}

static struct chan *srvattach(char *spec)
{
	/* the inferno attach was pretty complicated, but
	 * we're not sure that complexity is needed. */
	struct chan *c = devattach(devname(), spec);
	mkqid(&c->qid, Qtopdir, 0, QTDIR);
	/* c->aux is an uncounted ref */
	c->aux = top_dir;
	return c;
}

static struct walkqid *srvwalk(struct chan *c, struct chan *nc, char **name,
							   int nname)
{
	return devwalk(c, nc, name, nname, 0, 0, srvgen);
}

static int srvstat(struct chan *c, uint8_t * db, int n)
{
	return devstat(c, db, n, 0, 0, srvgen);
}

char*
srvname(struct chan *c)
{
	struct srvfile *srv_i;
	char *s;

	spin_lock(&srvlock);
	TAILQ_FOREACH(srv_i, &srvfiles, link) {
		if(srv_i->chan == c){
			int len = 3 + strlen(srv_i->name) + 1;
			s = kzmalloc(len, 0);
			snprintf(s, len, "#s/%s", srv_i->name);
			spin_unlock(&srvlock);
			return s;
		}
	}
	spin_unlock(&srvlock);
	return NULL;
}

static struct chan *srvopen(struct chan *c, int omode)
{
	ERRSTACK(1);
	struct srvfile *srv;
	openmode(omode);	/* used as an error checker in plan9, does little now */
	if (c->qid.type & QTDIR) {
		if (omode & O_WRITE)
			error(EISDIR, ERROR_FIXME);
		c->mode = openmode(omode);
		c->flag |= COPEN;
		c->offset = 0;
		return c;
	}
	srv = c->aux;
	if (!grab_ref(srv))
		error(EFAIL, "Unable to open srv file, concurrent removal");
	if (waserror()) {
		kref_put(&srv->ref);
		nexterror();
	}
	devpermcheck(srv->user, srv->perm, omode);
	if ((srv->perm & DMEXCL) && atomic_read(&srv->opens))
		error(EBUSY, ERROR_FIXME);
	/* srv->chan is write-once, so we don't need to sync. */
	if (!srv->chan)
		error(EFAIL, "srv file has no chan yet");
	/* this is more than just the ref - 1, since there will be refs in flight
	 * as gens work their way through the list */
	atomic_inc(&srv->opens);
	/* the magic of srv: open c, get c->srv->chan back */
	cclose(c);
	c = srv->chan;
	chan_incref(c);
	poperror();
	kref_put(&srv->ref);
	return c;
}

static void srvcreate(struct chan *c, char *name, int omode, uint32_t perm)
{
	struct srvfile *srv;
	srv = kzmalloc(sizeof(struct srvfile), MEM_WAIT);
	kstrdup(&srv->name, name);
	kstrdup(&srv->user, current ? current->user : "eve");
	srv->perm = 0770;	/* TODO need some security thoughts */
	atomic_set(&srv->opens, 1);	/* we return it opened */
	mkqid(&c->qid, Qsrvfile, 0, QTFILE);
	c->aux = srv;
	c->mode = openmode(omode);
	/* one ref for being on the list */
	kref_init(&srv->ref, srv_release, 1);
	spin_lock(&srvlock);
	TAILQ_INSERT_TAIL(&srvfiles, srv, link);
	spin_unlock(&srvlock);
	atomic_inc(&nr_srvs);
}

static int srvwstat(struct chan *c, uint8_t * dp, int n)
{
	error(ENOSYS, ERROR_FIXME);
	return -1;
}

static void srvremove(struct chan *c)
{
	struct srvfile *srv_i, *temp;

	spin_lock(&srvlock);
	TAILQ_FOREACH_SAFE(srv_i, &srvfiles, link, temp) {
		if (srv_i == c->aux) {
			TAILQ_REMOVE(&srvfiles, srv_i, link);
			break;
		}
	}
	spin_unlock(&srvlock);
	if (srv_i)
		kref_put(&srv_i->ref);	/* dropping ref from the list */
}

static void srvclose(struct chan *c)
{
	struct srvfile *srv = c->aux;

	if (!grab_ref(srv))
		return;
	atomic_dec(&srv->opens);
	kref_put(&srv->ref);
	if (c->flag & O_REMCLO)
		srvremove(c);
}

/* N.B. srvopen gives the chan back. The only 'reading' we do
 * in srv is of the top level directory.
 */
static long srvread(struct chan *c, void *va, long count, int64_t offset)
{
	return devdirread(c, va, count, 0, 0, srvgen);
}

static long srvwrite(struct chan *c, void *va, long count, int64_t offset)
{
	ERRSTACK(2);
	struct srvfile *srv;
	struct chan *new_chan;
	char *kbuf = 0;
	int fd;

	if (c->qid.type & QTDIR)
		error(EPERM, ERROR_FIXME);
	srv = c->aux;
	if (!grab_ref(srv))
		error(EFAIL, "Unable to write srv file, concurrent removal");
	if (waserror()) {
		kref_put(&srv->ref);
		nexterror();
	}
	if (srv->chan)
		error(EFAIL, "srv file already has a stored chan!");
	if (waserror()) {
		kfree(kbuf);
		nexterror();
	}
	kbuf = kmalloc(count + 1, MEM_WAIT);
	strlcpy(kbuf, va, count + 1);
	fd = strtoul(kbuf, 0, 10);
	/* the magic of srv: srv stores the chan corresponding to the fd.  -1 for
	 * mode, so we just get the chan with no checks (RDWR would work too). */
	new_chan = fdtochan(&current->open_files, fd, -1, FALSE, TRUE);
	/* fdtochan already increffed for us */
	if (!__sync_bool_compare_and_swap(&srv->chan, 0, new_chan)) {
		cclose(new_chan);
		error(EFAIL, "srv file already has a stored chan!");
	}
	poperror();
	kfree(kbuf);
	poperror();
	kref_put(&srv->ref);
	return count;
}

struct dev srvdevtab __devtab = {
	.name = "srv",

	.reset = devreset,
	.init = srvinit,
	.shutdown = devshutdown,
	.attach = srvattach,
	.walk = srvwalk,
	.stat = srvstat,
	.open = srvopen,
	.create = srvcreate,
	.close = srvclose,
	.read = srvread,
	.bread = devbread,
	.write = srvwrite,
	.bwrite = devbwrite,
	.remove = srvremove,
	.wstat = srvwstat,
	.power = devpower,
	.chaninfo = devchaninfo,
};
