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