xref: /plan9/sys/src/cmd/disk/9660/unix.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
1*80ee5cbfSDavid du Colombier #include <u.h>
2*80ee5cbfSDavid du Colombier #include <libc.h>
3*80ee5cbfSDavid du Colombier #include <bio.h>
4*80ee5cbfSDavid du Colombier #include <libsec.h>
5*80ee5cbfSDavid du Colombier #include <libproto.h>
6*80ee5cbfSDavid du Colombier #include <ctype.h>
7*80ee5cbfSDavid du Colombier 
8*80ee5cbfSDavid du Colombier #include "iso9660.h"
9*80ee5cbfSDavid du Colombier 
10*80ee5cbfSDavid du Colombier #include <grp.h>
11*80ee5cbfSDavid du Colombier #include <pwd.h>
12*80ee5cbfSDavid du Colombier 
13*80ee5cbfSDavid du Colombier typedef struct Xarg Xarg;
14*80ee5cbfSDavid du Colombier struct Xarg {
15*80ee5cbfSDavid du Colombier 	void (*enm)(char*,char*,XDir*,void*);
16*80ee5cbfSDavid du Colombier 	void (*warn)(char*,void*);
17*80ee5cbfSDavid du Colombier 	void *arg;
18*80ee5cbfSDavid du Colombier };
19*80ee5cbfSDavid du Colombier 
20*80ee5cbfSDavid du Colombier static long numericuid(char *user);
21*80ee5cbfSDavid du Colombier static long numericgid(char *gp);
22*80ee5cbfSDavid du Colombier 
23*80ee5cbfSDavid du Colombier void
dirtoxdir(XDir * xd,Dir * d)24*80ee5cbfSDavid du Colombier dirtoxdir(XDir *xd, Dir *d)
25*80ee5cbfSDavid du Colombier {
26*80ee5cbfSDavid du Colombier 	//	char buf[NAMELEN+1];
27*80ee5cbfSDavid du Colombier 	memset(xd, 0, sizeof *xd);
28*80ee5cbfSDavid du Colombier 
29*80ee5cbfSDavid du Colombier 	xd->name = atom(d->name);
30*80ee5cbfSDavid du Colombier 	xd->uid = atom(d->uid);
31*80ee5cbfSDavid du Colombier 	xd->gid = atom(d->gid);
32*80ee5cbfSDavid du Colombier 	xd->uidno = numericuid(d->uid);
33*80ee5cbfSDavid du Colombier 	xd->gidno = numericgid(d->gid);
34*80ee5cbfSDavid du Colombier 	xd->mode = d->mode;
35*80ee5cbfSDavid du Colombier 	xd->atime = d->atime;
36*80ee5cbfSDavid du Colombier 	xd->mtime = d->mtime;
37*80ee5cbfSDavid du Colombier 	xd->ctime = 0;
38*80ee5cbfSDavid du Colombier 	xd->length = d->length;
39*80ee5cbfSDavid du Colombier 	if(xd->mode & CHLINK) {
40*80ee5cbfSDavid du Colombier 		xd->mode |= 0777;
41*80ee5cbfSDavid du Colombier 		xd->symlink = atom(d->symlink);
42*80ee5cbfSDavid du Colombier 	}
43*80ee5cbfSDavid du Colombier };
44*80ee5cbfSDavid du Colombier 
45*80ee5cbfSDavid du Colombier void
fdtruncate(int fd,ulong size)46*80ee5cbfSDavid du Colombier fdtruncate(int fd, ulong size)
47*80ee5cbfSDavid du Colombier {
48*80ee5cbfSDavid du Colombier 	ftruncate(fd, size);
49*80ee5cbfSDavid du Colombier 
50*80ee5cbfSDavid du Colombier 	return;
51*80ee5cbfSDavid du Colombier }
52*80ee5cbfSDavid du Colombier 
53*80ee5cbfSDavid du Colombier static long
numericuid(char * user)54*80ee5cbfSDavid du Colombier numericuid(char *user)
55*80ee5cbfSDavid du Colombier {
56*80ee5cbfSDavid du Colombier 	struct passwd *pass;
57*80ee5cbfSDavid du Colombier 	static int warned = 0;
58*80ee5cbfSDavid du Colombier 
59*80ee5cbfSDavid du Colombier 	if (! (pass = getpwnam(user))) {
60*80ee5cbfSDavid du Colombier 		if (!warned)
61*80ee5cbfSDavid du Colombier 			fprint(2, "Warning: getpwnam(3) failed for \"%s\"\n", user);
62*80ee5cbfSDavid du Colombier 		warned = 1;
63*80ee5cbfSDavid du Colombier 		return 0;
64*80ee5cbfSDavid du Colombier 	}
65*80ee5cbfSDavid du Colombier 
66*80ee5cbfSDavid du Colombier 	return pass->pw_uid;
67*80ee5cbfSDavid du Colombier }
68*80ee5cbfSDavid du Colombier 
69*80ee5cbfSDavid du Colombier static long
numericgid(char * gp)70*80ee5cbfSDavid du Colombier numericgid(char *gp)
71*80ee5cbfSDavid du Colombier {
72*80ee5cbfSDavid du Colombier 	struct group *gr;
73*80ee5cbfSDavid du Colombier 	static int warned = 0;
74*80ee5cbfSDavid du Colombier 
75*80ee5cbfSDavid du Colombier 	if (! (gr = getgrnam(gp))) {
76*80ee5cbfSDavid du Colombier 		if (!warned)
77*80ee5cbfSDavid du Colombier 			fprint(2, "Warning: getgrnam(3) failed for \"%s\"\n", gp);
78*80ee5cbfSDavid du Colombier 		warned = 1;
79*80ee5cbfSDavid du Colombier 		return 0;
80*80ee5cbfSDavid du Colombier 	}
81*80ee5cbfSDavid du Colombier 
82*80ee5cbfSDavid du Colombier 	return gr->gr_gid;
83*80ee5cbfSDavid du Colombier }
84