#include <u.h>
#include <libc.h>
#include <bio.h>
#include <libsec.h>
#include <disk.h>
#include <ctype.h>

#include "iso9660.h"

#include <grp.h>
#include <pwd.h>

typedef struct Xarg Xarg;
struct Xarg {
	void (*enm)(char*,char*,XDir*,void*);
	void (*warn)(char*,void*);
	void *arg;
};

static long numericuid(char *user);
static long numericgid(char *gp);

void
dirtoxdir(XDir *xd, Dir *d)
{
	//	char buf[NAMELEN+1];
	memset(xd, 0, sizeof *xd);

	xd->name = atom(d->name);
	xd->uid = atom(d->uid);
	xd->gid = atom(d->gid);
	xd->uidno = numericuid(d->uid);
	xd->gidno = numericgid(d->gid);
	xd->mode = d->mode;
	xd->atime = d->atime;
	xd->mtime = d->mtime;
	xd->ctime = 0;
	xd->length = d->length;
	if(xd->mode & CHLINK) {
		xd->mode |= 0777;
		//xd->symlink = atom(d->symlink);
		xd->symlink = atom("symlink");		// XXX: rsc
	}
};

void
fdtruncate(int fd, ulong size)
{
	ftruncate(fd, size);

	return;
}

static long
numericuid(char *user)
{
	struct passwd *pass;
	static int warned = 0;

	if (! (pass = getpwnam(user))) {
		if (!warned)
			fprint(2, "Warning: getpwnam(3) failed for \"%s\"\n", user);
		warned = 1;
		return 0;
	}

	return pass->pw_uid;
}

static long
numericgid(char *gp)
{
	struct group *gr;
	static int warned = 0;

	if (! (gr = getgrnam(gp))) {
		if (!warned)
			fprint(2, "Warning: getgrnam(3) failed for \"%s\"\n", gp);
		warned = 1;
		return 0;
	}

	return gr->gr_gid;
}
