| #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; |
| } |