/* * Add links. */ void createlinks(void) { struct entry *np, *ep; ino_t i; char name[BUFSIZ]; if ((ep = lookupino(WINO))) { vprintf(stdout, "Add whiteouts\n"); for ( ; ep != NULL; ep = ep->e_links) { if ((ep->e_flags & NEW) == 0) continue; (void) addwhiteout(myname(ep)); ep->e_flags &= ~NEW; } } vprintf(stdout, "Add links\n"); for (i = ROOTINO; i < maxino; i++) { ep = lookupino(i); if (ep == NULL) continue; for (np = ep->e_links; np != NULL; np = np->e_links) { if ((np->e_flags & NEW) == 0) continue; (void) strcpy(name, myname(ep)); if (ep->e_type == NODE) { (void) linkit(name, myname(np), SYMLINK); } else { (void) linkit(name, myname(np), HARDLINK); } np->e_flags &= ~NEW; } } }
int main(int argc, char *argv[]) { struct stat sb; int ch, exitval; char *sourcedir; if (pledge("stdio rpath cpath", NULL) == -1) err(1, "pledge"); while ((ch = getopt(argc, argv, "fhLnPs")) != -1) switch (ch) { case 'f': fflag = 1; break; case 'h': case 'n': hflag = 1; break; case 'L': Pflag = 0; break; case 'P': Pflag = 1; break; case 's': sflag = 1; break; default: usage(); } argv += optind; argc -= optind; switch(argc) { case 0: usage(); case 1: /* ln target */ exit(linkit(argv[0], ".", 1)); case 2: /* ln target source */ exit(linkit(argv[0], argv[1], 0)); } /* ln target1 target2 directory */ sourcedir = argv[argc - 1]; if (stat(sourcedir, &sb)) err(1, "%s", sourcedir); if (!S_ISDIR(sb.st_mode)) usage(); for (exitval = 0; *argv != sourcedir; ++argv) exitval |= linkit(*argv, sourcedir, 1); exit(exitval); }
int main(int argc, char *argv[]) { struct stat sb; int ch, exitval; char *sourcedir; while ((ch = getopt(argc, argv, "Ffhns")) != -1) switch (ch) { case 'F': dirflag = 1; /* XXX: deliberately undocumented. */ break; case 'f': fflag = 1; break; case 'h': case 'n': hflag = 1; break; case 's': sflag = 1; break; default: usage(); } argv += optind; argc -= optind; linkf = sflag ? symlink : link; switch(argc) { case 0: usage(); case 1: /* ln target */ exit(linkit(argv[0], ".", 1)); case 2: /* ln target source */ exit(linkit(argv[0], argv[1], 0)); } /* ln target1 target2 directory */ sourcedir = argv[argc - 1]; if (stat(sourcedir, &sb)) err(1, "%s", sourcedir); if (!S_ISDIR(sb.st_mode)) usage(); for (exitval = 0; *argv != sourcedir; ++argv) exitval |= linkit(*argv, sourcedir, 1); exit(exitval); }
//------------------------------------------------------------ static void checkTocLink( const char *toc_file_name, hashTable<CC_String,int> &linkTab, hashTable<CC_String,BTCollectable> &nodeTab ) { int flag = 0; char *ToCFileName = strdup ( toc_file_name ); hashTableIterator<CC_String,BTCollectable> nodeit( nodeTab ); while ( ++nodeit ) { CC_String *key = (CC_String *)nodeit.key(); BTCollectable *value = (BTCollectable *)nodeit.value(); if ( !linkTab.contains( key ) ) { flag = 1; const char *file_name = value->filename(); int line_num = value->linenum(); cerr << "(ERROR) Section ID = " << (const char *)*key << endl << " of file = " << file_name << endl << " at line = " << line_num << endl << " does not have a corresponding link with the value = " << (const char *)*key << endl << " from the ToC file = " << ToCFileName << "\n\n"; } } hashTableIterator<CC_String,int> linkit( linkTab ); while ( ++linkit ) { CC_String *link = linkit.key(); int *line_num = linkit.value(); if ( !nodeTab.contains( link ) ) { flag = 1; cerr << "(ERROR) IDREF = " << (const char *)*link << endl << " of ToC file = " << ToCFileName << endl << " at line = " << *line_num << endl << " is pointing to an unavailable node\n\n"; } } delete ToCFileName; if ( flag ) { throw(Unexpected("TOC validation failed\n")); } }
int extractfile(char *name) { int flags; uid_t uid; gid_t gid; mode_t mode; int extsize; struct timeval mtimep[2], ctimep[2]; struct entry *ep; char *buf; curfile.name = name; curfile.action = USING; mtimep[0].tv_sec = curfile.atime_sec; mtimep[0].tv_usec = curfile.atime_nsec / 1000; mtimep[1].tv_sec = curfile.mtime_sec; mtimep[1].tv_usec = curfile.mtime_nsec / 1000; ctimep[0].tv_sec = curfile.atime_sec; ctimep[0].tv_usec = curfile.atime_nsec / 1000; ctimep[1].tv_sec = curfile.birthtime_sec; ctimep[1].tv_usec = curfile.birthtime_nsec / 1000; extsize = curfile.extsize; uid = getuid(); if (uid == 0) uid = curfile.uid; gid = curfile.gid; mode = curfile.mode; flags = curfile.file_flags; switch (mode & IFMT) { default: fprintf(stderr, "%s: unknown file mode 0%o\n", name, mode); skipfile(); return (FAIL); case IFSOCK: vprintf(stdout, "skipped socket %s\n", name); skipfile(); return (GOOD); case IFDIR: if (mflag) { ep = lookupname(name); if (ep == NULL || ep->e_flags & EXTRACT) panic("unextracted directory %s\n", name); skipfile(); return (GOOD); } vprintf(stdout, "extract file %s\n", name); return (genliteraldir(name, curfile.ino)); case IFLNK: lnkbuf[0] = '\0'; pathlen = 0; buf = setupextattr(extsize); getfile(xtrlnkfile, xtrattr, xtrlnkskip); if (pathlen == 0) { vprintf(stdout, "%s: zero length symbolic link (ignored)\n", name); return (GOOD); } if (linkit(lnkbuf, name, SYMLINK) == GOOD) { if (extsize > 0) set_extattr_link(name, buf, extsize); (void) lchown(name, uid, gid); (void) lchmod(name, mode); (void) lutimes(name, ctimep); (void) lutimes(name, mtimep); (void) lchflags(name, flags); return (GOOD); } return (FAIL); case IFIFO: vprintf(stdout, "extract fifo %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (uflag) (void) unlink(name); if (mkfifo(name, 0600) < 0) { fprintf(stderr, "%s: cannot create fifo: %s\n", name, strerror(errno)); skipfile(); return (FAIL); } if (extsize == 0) { skipfile(); } else { buf = setupextattr(extsize); getfile(xtrnull, xtrattr, xtrnull); set_extattr_file(name, buf, extsize); } (void) chown(name, uid, gid); (void) chmod(name, mode); (void) utimes(name, ctimep); (void) utimes(name, mtimep); (void) chflags(name, flags); return (GOOD); case IFCHR: case IFBLK: vprintf(stdout, "extract special file %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (uflag) (void) unlink(name); if (mknod(name, (mode & (IFCHR | IFBLK)) | 0600, (int)curfile.rdev) < 0) { fprintf(stderr, "%s: cannot create special file: %s\n", name, strerror(errno)); skipfile(); return (FAIL); } if (extsize == 0) { skipfile(); } else { buf = setupextattr(extsize); getfile(xtrnull, xtrattr, xtrnull); set_extattr_file(name, buf, extsize); } (void) chown(name, uid, gid); (void) chmod(name, mode); (void) utimes(name, ctimep); (void) utimes(name, mtimep); (void) chflags(name, flags); return (GOOD); case IFREG: vprintf(stdout, "extract file %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (uflag) (void) unlink(name); if ((ofile = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0600)) < 0) { fprintf(stderr, "%s: cannot create file: %s\n", name, strerror(errno)); skipfile(); return (FAIL); } buf = setupextattr(extsize); getfile(xtrfile, xtrattr, xtrskip); if (extsize > 0) set_extattr_fd(ofile, name, buf, extsize); (void) fchown(ofile, uid, gid); (void) fchmod(ofile, mode); (void) futimes(ofile, ctimep); (void) futimes(ofile, mtimep); (void) fchflags(ofile, flags); (void) close(ofile); return (GOOD); } /* NOTREACHED */ }
int main(int argc, char *argv[]) { struct stat sb; int ch, exitval; char *sourcedir; setprogname(argv[0]); (void)setlocale(LC_ALL, ""); while ((ch = getopt(argc, argv, "fhinsv")) != -1) switch (ch) { case 'f': fflag = 1; iflag = 0; break; case 'h': case 'n': hflag = 1; break; case 'i': iflag = 1; fflag = 0; break; case 's': sflag = 1; break; case 'v': vflag = 1; break; case '?': default: usage(); /* NOTREACHED */ } argv += optind; argc -= optind; if (sflag) { linkf = symlink; linkch = '-'; } else { linkf = link; linkch = '='; } switch(argc) { case 0: usage(); /* NOTREACHED */ case 1: /* ln target */ exit(linkit(argv[0], ".", 1)); /* NOTREACHED */ case 2: /* ln target source */ exit(linkit(argv[0], argv[1], 0)); /* NOTREACHED */ } /* ln target1 target2 directory */ sourcedir = argv[argc - 1]; if (hflag && lstat(sourcedir, &sb) == 0 && S_ISLNK(sb.st_mode)) { /* we were asked not to follow symlinks, but found one at the target--simulate "not a directory" error */ errno = ENOTDIR; err(EXIT_FAILURE, "%s", sourcedir); /* NOTREACHED */ } if (stat(sourcedir, &sb)) { err(EXIT_FAILURE, "%s", sourcedir); /* NOTREACHED */ } if (!S_ISDIR(sb.st_mode)) { usage(); /* NOTREACHED */ } for (exitval = 0; *argv != sourcedir; ++argv) exitval |= linkit(*argv, sourcedir, 1); exit(exitval); /* NOTREACHED */ }
int extractfile(char *name) { u_int flags; uid_t uid; gid_t gid; mode_t mode; struct timeval mtimep[2], ctimep[2]; struct entry *ep; int setbirth; curfile.name = name; curfile.action = USING; mtimep[0].tv_sec = curfile.atime_sec; mtimep[0].tv_usec = curfile.atime_nsec / 1000; mtimep[1].tv_sec = curfile.mtime_sec; mtimep[1].tv_usec = curfile.mtime_nsec / 1000; setbirth = curfile.birthtime_sec != 0; if (setbirth) { ctimep[0].tv_sec = curfile.atime_sec; ctimep[0].tv_usec = curfile.atime_nsec / 1000; ctimep[1].tv_sec = curfile.birthtime_sec; ctimep[1].tv_usec = curfile.birthtime_nsec / 1000; } uid = curfile.uid; gid = curfile.gid; mode = curfile.mode; flags = curfile.file_flags; switch (mode & IFMT) { default: fprintf(stderr, "%s: unknown file mode 0%o\n", name, mode); skipfile(); return (FAIL); case IFSOCK: Vprintf(stdout, "skipped socket %s\n", name); skipfile(); return (GOOD); case IFDIR: if (mflag) { ep = lookupname(name); if (ep == NULL || ep->e_flags & EXTRACT) panic("unextracted directory %s\n", name); skipfile(); return (GOOD); } Vprintf(stdout, "extract file %s\n", name); return (genliteraldir(name, curfile.ino)); case IFLNK: { lnkbuf[0] = '\0'; pathlen = 0; getfile(xtrlnkfile, xtrlnkskip); if (pathlen == 0) { Vprintf(stdout, "%s: zero length symbolic link (ignored)\n", name); return (GOOD); } if (linkit(lnkbuf, name, SYMLINK) == FAIL) return (FAIL); (void)lchown(name, uid, gid); return (GOOD); } case IFCHR: case IFBLK: Vprintf(stdout, "extract special file %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (mknod(name, mode, (int)curfile.rdev) < 0) { warn("%s: cannot create special file", name); skipfile(); return (FAIL); } (void)chown(name, uid, gid); (void)chmod(name, mode); (void)chflags(name, flags); skipfile(); if (setbirth) (void)utimes(name, ctimep); (void)utimes(name, mtimep); return (GOOD); case IFIFO: Vprintf(stdout, "extract fifo %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (mkfifo(name, mode) < 0) { warn("%s: cannot create fifo", name); skipfile(); return (FAIL); } (void)chown(name, uid, gid); (void)chmod(name, mode); (void)chflags(name, flags); skipfile(); if (setbirth) (void)utimes(name, ctimep); (void)utimes(name, mtimep); return (GOOD); case IFREG: Vprintf(stdout, "extract file %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if ((ofile = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { warn("%s: cannot create file", name); skipfile(); return (FAIL); } (void)fchown(ofile, curfile.uid, curfile.gid); (void)fchmod(ofile, mode); (void)fchflags(ofile, flags); getfile(xtrfile, xtrskip); (void)close(ofile); if (setbirth) (void)utimes(name, ctimep); (void)utimes(name, mtimep); return (GOOD); } /* NOTREACHED */ }
int kmk_builtin_ln(int argc, char *argv[], char **envp) { struct stat sb; char *sourcedir; int ch, exitval; /* initialize globals. */ fflag = hflag = iflag = sflag = vflag = 0; linkch = 0; linkf = NULL; /* kmk: reset getopt() and set program name. */ g_progname = argv[0]; opterr = 1; optarg = NULL; optopt = 0; optind = 0; /* init */ while ((ch = getopt_long(argc, argv, "fhinsv", long_options, NULL)) != -1) switch (ch) { case 'f': fflag = 1; iflag = 0; break; case 'h': case 'n': hflag = 1; break; case 'i': iflag = 1; fflag = 0; break; case 's': sflag = 1; break; case 'v': vflag = 1; break; case 261: usage(stdout); return 0; case 262: return kbuild_version(argv[0]); case '?': default: return usage(stderr); } argv += optind; argc -= optind; linkf = sflag ? symlink : link; linkch = sflag ? '-' : '='; switch(argc) { case 0: return usage(stderr); /* NOTREACHED */ case 1: /* ln target */ return linkit(argv[0], ".", 1); case 2: /* ln target source */ return linkit(argv[0], argv[1], 0); default: ; } /* ln target1 target2 directory */ sourcedir = argv[argc - 1]; if (hflag && lstat(sourcedir, &sb) == 0 && S_ISLNK(sb.st_mode)) { /* * We were asked not to follow symlinks, but found one at * the target--simulate "not a directory" error */ errno = ENOTDIR; return err(1, "st_mode: %s", sourcedir); } if (stat(sourcedir, &sb)) return err(1, "stat: %s", sourcedir); if (!S_ISDIR(sb.st_mode)) return usage(stderr); for (exitval = 0; *argv != sourcedir; ++argv) exitval |= linkit(*argv, sourcedir, 1); return exitval; }
static int main_ln(rtems_shell_ln_globals* globals, int argc, char *argv[]) { struct stat sb; int ch, exitval; char *sourcedir; struct getopt_data getopt_reent; memset(&getopt_reent, 0, sizeof(getopt_data)); #if RTEMS_REMOVED setprogname(argv[0]); (void)setlocale(LC_ALL, ""); #endif while ((ch = getopt_r(argc, argv, "fhinsv", &getopt_reent)) != -1) switch (ch) { case 'f': fflag = 1; iflag = 0; break; case 'h': case 'n': hflag = 1; break; case 'i': iflag = 1; fflag = 0; break; case 's': sflag = 1; break; case 'v': vflag = 1; break; case '?': default: usage(globals); /* NOTREACHED */ } argv += getopt_reent.optind; argc -= getopt_reent.optind; if (sflag) { linkf = symlink; linkch = '-'; } else { linkf = link; linkch = '='; } switch(argc) { case 0: usage(globals); /* NOTREACHED */ case 1: /* ln target */ exit(linkit(globals, argv[0], ".", 1)); /* NOTREACHED */ case 2: /* ln target source */ exit(linkit(globals, argv[0], argv[1], 0)); /* NOTREACHED */ } /* ln target1 target2 directory */ sourcedir = argv[argc - 1]; if (hflag && lstat(sourcedir, &sb) == 0 && S_ISLNK(sb.st_mode)) { /* we were asked not to follow symlinks, but found one at the target--simulate "not a directory" error */ errno = ENOTDIR; err(exit_jump, EXIT_FAILURE, "%s", sourcedir); /* NOTREACHED */ } if (stat(sourcedir, &sb)) { err(exit_jump, EXIT_FAILURE, "%s", sourcedir); /* NOTREACHED */ } if (!S_ISDIR(sb.st_mode)) { usage(globals); /* NOTREACHED */ } for (exitval = 0; *argv != sourcedir; ++argv) exitval |= linkit(globals, *argv, sourcedir, 1); exit(exitval); /* NOTREACHED */ return 0; }
int main(int argc, char *argv[]) { struct stat sb; char *p, *targetdir; int ch, exitval; /* * Test for the special case where the utility is called as * "link", for which the functionality provided is greatly * simplified. */ if ((p = strrchr(argv[0], '/')) == NULL) p = argv[0]; else ++p; if (strcmp(p, "link") == 0) { while (getopt(argc, argv, "") != -1) usage(); argc -= optind; argv += optind; if (argc != 2) usage(); exit(linkit(argv[0], argv[1], 0)); } while ((ch = getopt(argc, argv, "FLPfhinsvw")) != -1) switch (ch) { case 'F': Fflag = 1; break; case 'L': Pflag = 0; break; case 'P': Pflag = 1; break; case 'f': fflag = 1; iflag = 0; wflag = 0; break; case 'h': case 'n': hflag = 1; break; case 'i': iflag = 1; fflag = 0; break; case 's': sflag = 1; break; case 'v': vflag = 1; break; case 'w': wflag = 1; break; case '?': default: usage(); } argv += optind; argc -= optind; linkch = sflag ? '-' : '='; if (sflag == 0) Fflag = 0; if (Fflag == 1 && iflag == 0) { fflag = 1; wflag = 0; /* Implied when fflag != 0 */ } switch(argc) { case 0: usage(); /* NOTREACHED */ case 1: /* ln source */ exit(linkit(argv[0], ".", 1)); case 2: /* ln source target */ exit(linkit(argv[0], argv[1], 0)); default: ; } /* ln source1 source2 directory */ targetdir = argv[argc - 1]; if (hflag && lstat(targetdir, &sb) == 0 && S_ISLNK(sb.st_mode)) { /* * We were asked not to follow symlinks, but found one at * the target--simulate "not a directory" error */ errno = ENOTDIR; err(1, "%s", targetdir); } if (stat(targetdir, &sb)) err(1, "%s", targetdir); if (!S_ISDIR(sb.st_mode)) usage(); for (exitval = 0; *argv != targetdir; ++argv) exitval |= linkit(*argv, targetdir, 1); exit(exitval); }
int extractfile(char *name) { int flags; uid_t uid; gid_t gid; mode_t mode; struct timeval timep[2]; struct entry *ep; curfile.name = name; curfile.action = USING; timep[0].tv_sec = curfile.dip->di_atime; timep[0].tv_usec = curfile.dip->di_atimensec / 1000; timep[1].tv_sec = curfile.dip->di_mtime; timep[1].tv_usec = curfile.dip->di_mtimensec / 1000; uid = curfile.dip->di_uid; gid = curfile.dip->di_gid; mode = curfile.dip->di_mode; flags = curfile.dip->di_flags; switch (mode & IFMT) { default: fprintf(stderr, "%s: unknown file mode 0%o\n", name, mode); skipfile(); return (FAIL); case IFSOCK: vprintf(stdout, "skipped socket %s\n", name); skipfile(); return (GOOD); case IFDIR: if (mflag) { ep = lookupname(name); if (ep == NULL || ep->e_flags & EXTRACT) panic("unextracted directory %s\n", name); skipfile(); return (GOOD); } vprintf(stdout, "extract file %s\n", name); return (genliteraldir(name, curfile.ino)); case IFLNK: lnkbuf[0] = '\0'; pathlen = 0; getfile(xtrlnkfile, xtrlnkskip); if (pathlen == 0) { vprintf(stdout, "%s: zero length symbolic link (ignored)\n", name); return (GOOD); } if (linkit(lnkbuf, name, SYMLINK) == GOOD) { lchown(name, uid, gid); lchmod(name, mode); lutimes(name, timep); return (GOOD); } return (FAIL); case IFIFO: vprintf(stdout, "extract fifo %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (uflag && !Nflag) unlink(name); if (mkfifo(name, mode) < 0) { fprintf(stderr, "%s: cannot create fifo: %s\n", name, strerror(errno)); skipfile(); return (FAIL); } chown(name, uid, gid); chmod(name, mode); utimes(name, timep); chflags(name, flags); skipfile(); return (GOOD); case IFCHR: case IFBLK: vprintf(stdout, "extract special file %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (uflag) unlink(name); if (mknod(name, mode, (int)curfile.dip->di_rdev) < 0) { fprintf(stderr, "%s: cannot create special file: %s\n", name, strerror(errno)); skipfile(); return (FAIL); } chown(name, uid, gid); chmod(name, mode); utimes(name, timep); chflags(name, flags); skipfile(); return (GOOD); case IFREG: vprintf(stdout, "extract file %s\n", name); if (Nflag) { skipfile(); return (GOOD); } if (uflag) unlink(name); if ((ofile = open(name, O_WRONLY | O_CREAT | O_TRUNC, 0666)) < 0) { fprintf(stderr, "%s: cannot create file: %s\n", name, strerror(errno)); skipfile(); return (FAIL); } fchown(ofile, uid, gid); fchmod(ofile, mode); getfile(xtrfile, xtrskip); close(ofile); utimes(name, timep); chflags(name, flags); return (GOOD); } /* NOTREACHED */ }