void cwalk(void) { FTS *t; FTSENT *p; time_t clock; char *argv[2], host[MAXHOSTNAMELEN]; int indent = 0; (void)time(&clock); (void)gethostname(host, sizeof(host)); (void)printf( "#\t user: %s\n#\tmachine: %s\n#\t tree: %s\n#\t date: %s", getlogin(), host, fullpath, ctime(&clock)); argv[0] = "."; argv[1] = NULL; if ((t = fts_open(argv, ftsoptions, dsort)) == NULL) error("fts_open: %s", strerror(errno)); while ((p = fts_read(t))) { if (iflag) indent = p->fts_level * 4; switch(p->fts_info) { case FTS_D: if (!dflag) (void)printf("\n"); if (!nflag) (void)printf("# %s\n", p->fts_path); statd(t, p, &uid, &gid, &mode); statf(indent, p); break; case FTS_DP: if (!nflag && (p->fts_level > 0)) (void)printf("%*s# %s\n", indent, "", p->fts_path); (void)printf("%*s..\n", indent, ""); if (!dflag) (void)printf("\n"); break; case FTS_DNR: case FTS_ERR: case FTS_NS: (void)fprintf(stderr, "mtree: %s: %s\n", p->fts_path, strerror(p->fts_errno)); break; default: if (!dflag) statf(indent, p); break; } } (void)fts_close(t); if (sflag && keys & F_CKSUM) (void)fprintf(stderr, "mtree: %s checksum: %u\n", fullpath, crc_total); }
void cwalk(void) { FTS *t; FTSENT *p; time_t clocktime; char host[MAXHOSTNAMELEN + 1]; char *argv[2]; char dot[] = "."; argv[0] = dot; argv[1] = NULL; time(&clocktime); gethostname(host, sizeof(host)); host[sizeof(host) - 1] = '\0'; printf( "#\t user: %s\n#\tmachine: %s\n#\t tree: %s\n#\t date: %s", getlogin(), host, fullpath, ctime(&clocktime)); if ((t = fts_open(argv, ftsoptions, dsort)) == NULL) mtree_err("fts_open: %s", strerror(errno)); while ((p = fts_read(t)) != NULL) { if (check_excludes(p->fts_name, p->fts_path)) { fts_set(t, p, FTS_SKIP); continue; } switch(p->fts_info) { case FTS_D: printf("\n# %s\n", p->fts_path); statd(t, p, &uid, &gid, &mode, &flags); statf(p); break; case FTS_DP: if (p->fts_level > 0) printf("# %s\n..\n\n", p->fts_path); break; case FTS_DNR: case FTS_ERR: case FTS_NS: mtree_err("%s: %s", p->fts_path, strerror(p->fts_errno)); break; default: if (!dflag) statf(p); break; } } fts_close(t); if (sflag && keys & F_CKSUM) mtree_err("%s checksum: %u", fullpath, crc_total); }
static int do_stat (confuga *C, const char *path, struct confuga_stat *info, int (*statf) (const char *, struct stat64 *)) { int rc; struct stat64 linfo; enum CONFUGA_FILE_TYPE type; RESOLVE(path) CATCHUNIX(statf(path, &linfo)); if (S_ISREG(linfo.st_mode)) { CATCH(lookup(C, path, &info->fid, &info->size, &type)); } else { info->size = linfo.st_size; } info->ino = linfo.st_ino; info->mode = linfo.st_mode; info->uid = linfo.st_uid; info->gid = linfo.st_gid; info->nlink = linfo.st_nlink; info->atime = linfo.st_atime; info->mtime = linfo.st_mtime; info->ctime = linfo.st_ctime; PROLOGUE }
void cwalk(void) { FTS *t; FTSENT *p; time_t cl; char *argv[2], host[MAXHOSTNAMELEN]; char dot[] = "."; int indent = 0; if (!nflag) { (void)time(&cl); (void)gethostname(host, sizeof(host)); (void)printf( "#\t user: %s\n#\tmachine: %s\n", getlogin(), host); (void)printf( "#\t tree: %s\n#\t date: %s", fullpath, ctime(&cl)); } argv[0] = dot; argv[1] = NULL; if ((t = fts_open(argv, ftsoptions, dsort)) == NULL) err(1, "fts_open()"); while ((p = fts_read(t))) { if (iflag) indent = p->fts_level * 4; if (check_excludes(p->fts_name, p->fts_path)) { fts_set(t, p, FTS_SKIP); continue; } switch(p->fts_info) { case FTS_D: if (!dflag) (void)printf("\n"); if (!nflag) (void)printf("# %s\n", p->fts_path); statd(t, p, &uid, &gid, &mode, &flags); statf(indent, p); break; case FTS_DP: if (!nflag && (p->fts_level > 0)) (void)printf("%*s# %s\n", indent, "", p->fts_path); (void)printf("%*s..\n", indent, ""); if (!dflag) (void)printf("\n"); break; case FTS_DNR: case FTS_ERR: case FTS_NS: warnx("%s: %s", p->fts_path, strerror(p->fts_errno)); break; default: if (!dflag) statf(indent, p); break; } } (void)fts_close(t); if (sflag && keys & F_CKSUM) warnx("%s checksum: %lu", fullpath, (unsigned long)crc_total); }
/* * Nomenclature warning! * * In this source "target" and "source" are used the opposite way they * are used in the ln(1) manual. Here "target" is the existing file and * "source" specifies the to-be-created link to "target". */ int linkit(char *target, char *source, int isdir) { struct stat sb; char *p, path[MAXPATHLEN]; int (*statf)(const char *, struct stat *); int exists, n; if (!sflag) { /* If target doesn't exist, quit now. */ if (stat(target, &sb)) { warn("%s", target); return (1); } /* Only symbolic links to directories, unless -F option used. */ if (!dirflag && S_ISDIR(sb.st_mode)) { errno = EISDIR; warn("%s", target); return (1); } } statf = hflag ? lstat : stat; /* If the source is a directory, append the target's name. */ if (isdir || (!statf(source, &sb) && S_ISDIR(sb.st_mode))) { if ((p = basename(target)) == NULL) { warn("%s", target); return (1); } n = snprintf(path, sizeof(path), "%s/%s", source, p); if (n < 0 || n >= sizeof(path)) { errno = ENAMETOOLONG; warn("%s/%s", source, p); return (1); } source = path; } exists = (lstat(source, &sb) == 0); /* * If doing hard links and the source (destination) exists and it * actually is the same file like the target (existing file), we * complain that the files are identical. If -f is specified, we * accept the job as already done and return with success. */ if (exists && !sflag) { struct stat tsb; if (stat(target, &tsb) != 0) { warn("%s: disappeared", target); return (1); } if (tsb.st_dev == sb.st_dev && tsb.st_ino == sb.st_ino) { if (fflag) return (0); else { warnx("%s and %s are identical (nothing done).", target, source); return (1); } } } /* * If the file exists, and -f was specified, unlink it. * Attempt the link. */ if ((fflag && unlink(source) < 0 && errno != ENOENT) || (*linkf)(target, source)) { warn("%s", source); return (1); } return (0); }
void cwalk(void) { FTS *t; FTSENT *p; time_t clocktime; char host[MAXHOSTNAMELEN + 1]; const char *user; char *argv[2]; char dot[] = "."; int indent = 0; argv[0] = dot; argv[1] = NULL; time(&clocktime); gethostname(host, sizeof(host)); host[sizeof(host) - 1] = '\0'; if ((user = getlogin()) == NULL) { struct passwd *pw; user = (pw = getpwuid(getuid())) == NULL ? pw->pw_name : "<unknown>"; } if (!nflag) printf( "#\t user: %s\n#\tmachine: %s\n#\t tree: %s\n" "#\t date: %s", user, host, fullpath, ctime(&clocktime)); if ((t = fts_open(argv, ftsoptions, dcmp)) == NULL) mtree_err("fts_open: %s", strerror(errno)); while ((p = fts_read(t)) != NULL) { if (jflag) indent = p->fts_level * 4; if (check_excludes(p->fts_name, p->fts_path)) { fts_set(t, p, FTS_SKIP); continue; } if (!find_only(p->fts_path)) { fts_set(t, p, FTS_SKIP); continue; } switch(p->fts_info) { case FTS_D: if (!bflag) printf("\n"); if (!nflag) printf("# %s\n", p->fts_path); statd(t, p, &uid, &gid, &mode, &flags); statf(indent, p); break; case FTS_DP: if (p->fts_level > 0) if (!nflag) printf("%*s# %s\n", indent, "", p->fts_path); if (p->fts_level > 0 || flavor == F_FREEBSD9) { printf("%*s..\n", indent, ""); if (!bflag) printf("\n"); } break; case FTS_DNR: case FTS_ERR: case FTS_NS: mtree_err("%s: %s", p->fts_path, strerror(p->fts_errno)); break; default: if (!dflag) statf(indent, p); break; } } fts_close(t); if (sflag && keys & F_CKSUM) mtree_err("%s checksum: %u", fullpath, crc_total); }
int main (int argc, char **argv) { char optdebugbuf[7]; int n, mark; char *cp; progname = ((cp = strrchr(argv[0], '/')) ? cp + 1 : argv[0]); while ((n = opt_get(argc, argv, "pthcmo")) > -1) switch (n) { case 'd': if (++debug < 6) { if (!optdebug) strcpy(optdebug = optdebugbuf, "-d"); else strcat(optdebug, "d"); } break; case 'V': version(); _exit(0); case 't': if (!opt_arg) usage(); LOG("option \"-t %s\" no longer supported", opt_arg); break; case 'p': if (!opt_arg) usage(); concurrency = strtoul(opt_arg, &cp, 10); if (concurrency > MAX_CONCURRENCY || concurrency <= 0 || *cp) fail(1, "Bad value for concurrency option -p"); break; case 'h': if (!opt_arg) usage(); throttlerate = strtoul(opt_arg, &cp, 10); if (throttlerate < 0) fail(1, "Bad value for throttle option -h"); break; case 'c': if (!(optpipelining = opt_arg)) usage(); if (strtoul(optpipelining, &cp, 10) < 0 || *cp) fail(1, "Bad value for pipeline option -c"); break; case 'm': if (!(optmax = opt_arg)) usage(); if (strtoul(optmax, &cp, 10) <= 0 || *cp) fail(1, "Bad value for max-prime-articles option -m"); break; case 'P': optlogpid = TRUE; log_with_pid(); break; default: usage(); } close(0); open("/dev/null", O_RDONLY); /* snag 6 and 7 so we can dup onto them */ if (-1 == dup2(2, 6) || -1 == dup2(2, 7) || -1 == dup2(2, 1)) fail(2, "Unable to dup standard error:%m"); parameters(TRUE); if (-1 == chdir(snroot)) fail(2, "chdir(%s):%m", snroot); init(); if (-1 == set_path_var()) fail(2, "No memory"); n = 0; if (opt_ind == argc) { DIR *dir; struct dirent *dp; struct stat st; char ch; if (!(dir = opendir("."))) fail(2, "opendir(%s):%m", snroot); while ((dp = readdir(dir))) if (is_valid_group(dp->d_name)) if (-1 == readlink(dp->d_name, &ch, 1)) /* no symlinks */ if (0 == statf(&st, "%s/.outgoing", dp->d_name)) if (S_ISDIR(st.st_mode)) if (add(dp->d_name) > -1) /* NB: add() from get.c */ n++; closedir(dir); } else { debug++; for (; opt_ind < argc; opt_ind++) if (add(argv[opt_ind]) > -1) n++; debug--; } if (n == 0) fail(0, "No groups to fetch"); for (mark = 0; jobs_not_done(); mark++) { struct timeval tv; fd_set rset; int max; while (sow() == 0) /* Start some jobs */ ; FD_ZERO(&rset); if (throttlerate) { max = throttle_setfds(&rset); if (sigusr) { sigusr = FALSE; LOG("throttling at %d bytes/sec", throttlerate); } } else max = -1; tv.tv_sec = 1; tv.tv_usec = 0; if (select(max + 1, &rset, NULL, NULL, &tv) > 0) if (throttlerate) throttle(&rset); if (sigchld || 1 == mark % 10) { sigchld = FALSE; while (reap() == 0) ; } } quit(); _exit(0); }