Lines Matching refs:state

206 preserve(State_t* state, const char* path, struct stat* ns, struct stat* os)  in preserve()  argument
210 …if ((state->preserve & PRESERVE_TIME) && tmxtouch(path, tmxgetatime(os), tmxgetmtime(os), TMX_NOTI… in preserve()
212 if (state->preserve & PRESERVE_IDS) in preserve()
215 if (n && chown(state->path, os->st_uid, os->st_gid)) in preserve()
236 visit(State_t* state, register FTSENT* ent) in visit() argument
265 if (state->hierarchy) in visit()
266 state->presiz = -1; in visit()
269 state->presiz = ent->fts_pathlen; in visit()
273 state->presiz--; in visit()
275 state->presiz -= base - ent->fts_name; in visit()
282 if (state->directory) in visit()
283 state->presiz -= len + 1; in visit()
288 base = ent->fts_path + state->presiz + 1; in visit()
289 len = ent->fts_pathlen - state->presiz - 1; in visit()
292 if (state->directory) in visit()
294 …if ((state->postsiz + len) > state->pathsiz && !(state->path = newof(state->path, char, state->pat… in visit()
296 if (state->hierarchy && ent->fts_level == 0 && strchr(base, '/')) in visit()
298 s = state->path + state->postsiz; in visit()
303 if (access(state->path, F_OK)) in visit()
305 st.st_mode = state->missmode; in visit()
309 stat(state->path, &st); in visit()
312 if (mkdir(state->path, st.st_mode & S_IPERM)) in visit()
314 … error(ERROR_SYSTEM|2, "%s: cannot create directory -- %s ignored", state->path, ent->fts_path); in visit()
327 …if (state->preserve && state->op != LN || ent->fts_level > 0 && (ent->fts_statp->st_mode & S_IRWXU… in visit()
330 memcpy(state->path + state->postsiz, base, len); in visit()
332 state->path[state->postsiz] = 0; in visit()
333 if (stat(state->path, &st)) in visit()
334 error(ERROR_SYSTEM|2, "%s: cannot stat", state->path); in visit()
337 …if ((ent->fts_statp->st_mode & S_IPERM) != (st.st_mode & S_IPERM) && chmod(state->path, ent->fts_s… in visit()
338 …error(ERROR_SYSTEM|2, "%s: cannot reset directory mode to %s", state->path, fmtmode(st.st_mode & S… in visit()
339 if (state->preserve & (PRESERVE_IDS|PRESERVE_TIME)) in visit()
340 preserve(state, state->path, &st, ent->fts_statp); in visit()
347 if (!state->recursive) in visit()
350 if (state->op == CP) in visit()
352 else if (state->link == link && !state->force) in visit()
369 if (state->directory) in visit()
370 memcpy(state->path + state->postsiz, base, len); in visit()
371 if (!(*state->stat)(state->path, &st)) in visit()
375 error(2, "%s: not a directory -- %s ignored", state->path, ent->fts_path); in visit()
379 …else if (mkdir(state->path, (ent->fts_statp->st_mode & S_IPERM)|(ent->fts_info == FTS_D ? S_IRWXU … in visit()
381 error(ERROR_SYSTEM|2, "%s: cannot create directory -- %s ignored", state->path, ent->fts_path); in visit()
384 if (!state->directory) in visit()
386 state->directory = 1; in visit()
387 state->path[state->postsiz++] = '/'; in visit()
388 state->presiz--; in visit()
396 if (state->link != pathsetlink) in visit()
404 if (state->op == CP) in visit()
412 if (state->directory) in visit()
413 memcpy(state->path + state->postsiz, base, len); in visit()
414 if ((*state->stat)(state->path, &st)) in visit()
416 …else if (state->update && !S_ISDIR(st.st_mode) && (unsigned long)ent->fts_statp->st_mtime < (unsig… in visit()
421 else if (!state->fs3d || !iview(&st)) in visit()
427 if (state->op != LN && st.st_dev == ent->fts_statp->st_dev && st.st_ino == ent->fts_statp->st_ino) in visit()
429 if (state->op == MV) in visit()
435 if (state->verbose) in visit()
436 sfputr(sfstdout, state->path, '\n'); in visit()
439 if (!state->official) in visit()
440 error(2, "%s: identical to %s", state->path, ent->fts_path); in visit()
445 error(2, "%s: cannot %s existing directory", state->path, state->opname); in visit()
448 if (state->verbose) in visit()
449 sfputr(sfstdout, state->path, '\n'); in visit()
450 rm = state->remove || ent->fts_info == FTS_SL; in visit()
451 if (!rm || !state->force) in visit()
453 if (S_ISLNK(st.st_mode) && (n = -1) || (n = open(state->path, O_RDWR|O_BINARY|O_cloexec)) >= 0) in visit()
457 if (state->force) in visit()
459 else if (state->interactive) in visit()
461 … if ((n = astquery(-1, "%s %s? ", state->opname, state->path)) < 0 || sh_checksig(state->context)) in visit()
466 else if (state->op == LN) in visit()
468 error(2, "%s: cannot %s existing file", state->path, state->opname); in visit()
472 else if (state->force) in visit()
480 st.st_uid != state->uid ? "``not owner''" : in visit()
482 if (state->interactive) in visit()
484 …query(-1, "override protection %s for %s? ", protection, state->path)) < 0 || sh_checksig(state->c… in visit()
492 error(2, "%s: cannot %s %s protection", state->path, state->opname, protection); in visit()
497 switch (state->backup) in visit()
502 if (s = strrchr(state->path, '/')) in visit()
504 e = state->path; in visit()
510 s = state->path; in visit()
517 …b->fts_name + n + 1, state->suffix, state->suflen) && (m = strtol(sub->fts_name + n + state->sufle… in visit()
524 if (s != state->path) in visit()
526 if (v || state->backup == BAK_number) in visit()
528 sfprintf(state->tmp, "%s.%s%d%s", state->path, state->suffix, v + 1, state->suffix); in visit()
533 sfprintf(state->tmp, "%s%s", state->path, state->suffix); in visit()
535 if (!(s = sfstruse(state->tmp))) in visit()
536 error(ERROR_SYSTEM|3, "%s: out of space", state->path); in visit()
537 if (rename(state->path, s)) in visit()
539 error(ERROR_SYSTEM|2, "%s: cannot backup to %s", state->path, s); in visit()
544 if (rm && remove(state->path)) in visit()
546 error(ERROR_SYSTEM|2, "%s: cannot remove", state->path); in visit()
553 switch (state->op) in visit()
558 if (!rename(ent->fts_path, state->path)) in visit()
562 else if (!rm && st.st_mode && !remove(state->path)) in visit()
569 error(ERROR_SYSTEM|2, "%s: cannot rename to %s", ent->fts_path, state->path); in visit()
579 if ((n = pathgetlink(ent->fts_path, state->text, sizeof(state->text) - 1)) < 0) in visit()
584 state->text[n] = 0; in visit()
585 if (pathsetlink(state->text, state->path)) in visit()
587 error(ERROR_SYSTEM|2, "%s: cannot copy symbolic link to %s", ent->fts_path, state->path); in visit()
591 else if (state->op == CP || S_ISREG(ent->fts_statp->st_mode) || S_ISDIR(ent->fts_statp->st_mode)) in visit()
598 …lse if ((wfd = open(state->path, (st.st_mode ? (state->wflags & ~O_EXCL) : state->wflags)|O_cloexe… in visit()
600 error(ERROR_SYSTEM|2, "%s: cannot write", state->path); in visit()
609 error(ERROR_SYSTEM|2, "%s: %s read stream error", ent->fts_path, state->path); in visit()
616 error(ERROR_SYSTEM|2, "%s: %s write stream error", ent->fts_path, state->path); in visit()
626 if (sfsync(op) || state->sync && fsync(wfd) || sfclose(op)) in visit()
632 …error(ERROR_SYSTEM|2, "%s: %s %s error", ent->fts_path, state->path, n == 1 ? ERROR_translate(0, 0… in visit()
641 if (mknod(state->path, ent->fts_statp->st_mode, idevice(ent->fts_statp))) in visit()
643 error(ERROR_SYSTEM|2, "%s: cannot copy special file to %s", ent->fts_path, state->path); in visit()
652 if (state->preserve) in visit()
656 if (stat(state->path, &st)) in visit()
657 error(ERROR_SYSTEM|2, "%s: cannot stat", state->path); in visit()
660state->preserve & PRESERVE_PERM) && (ent->fts_statp->st_mode & state->perm) != (st.st_mode & state in visit()
661 …error(ERROR_SYSTEM|2, "%s: cannot reset mode to %s", state->path, fmtmode(st.st_mode & state->perm… in visit()
662 if (state->preserve & (PRESERVE_IDS|PRESERVE_TIME)) in visit()
663 preserve(state, state->path, &st, ent->fts_statp); in visit()
666 if (state->op == MV && remove(ent->fts_path)) in visit()
671 if ((*state->link)(ent->fts_path, state->path)) in visit()
672 error(ERROR_SYSTEM|2, "%s: cannot link to %s", ent->fts_path, state->path); in visit()
691 State_t* state; in b_cp() local
696 if (!(sh = CMD_CONTEXT(context)) || !(state = (State_t*)sh->ptr)) in b_cp()
698 if (!(state = newof(0, State_t, 1, 0))) in b_cp()
701 sh->ptr = state; in b_cp()
704 memset(state, 0, offsetof(State_t, INITSTATE)); in b_cp()
705 state->context = context; in b_cp()
706 state->presiz = -1; in b_cp()
708 state->flags = FTS_NOCHDIR|FTS_NOSEEDOTDIR; in b_cp()
709 state->uid = geteuid(); in b_cp()
710 state->wflags = O_WRONLY|O_CREAT|O_TRUNC|O_BINARY; in b_cp()
711 if (!state->tmp && !(state->tmp = sfstropen())) in b_cp()
713 sfputr(state->tmp, usage_head, -1); in b_cp()
719 sfputr(state->tmp, usage_cp, -1); in b_cp()
720 state->op = CP; in b_cp()
721 state->stat = stat; in b_cp()
726 sfputr(state->tmp, usage_ln, -1); in b_cp()
727 state->op = LN; in b_cp()
728 state->flags |= FTS_PHYSICAL; in b_cp()
729 state->link = link; in b_cp()
730 state->remove = 1; in b_cp()
731 state->stat = lstat; in b_cp()
736 sfputr(state->tmp, usage_mv, -1); in b_cp()
737 state->op = MV; in b_cp()
738 state->flags |= FTS_PHYSICAL; in b_cp()
739 state->preserve = PRESERVE_IDS|PRESERVE_PERM|PRESERVE_TIME; in b_cp()
740 state->stat = lstat; in b_cp()
747 sfputr(state->tmp, usage_tail, -1); in b_cp()
748 if (!(usage = sfstruse(state->tmp))) in b_cp()
749 error(ERROR_SYSTEM|3, "%s: out of space", state->path); in b_cp()
750state->opname = state->op == CP ? ERROR_translate(0, 0, 0, "overwrite") : ERROR_translate(0, 0, 0,… in b_cp()
756 state->flags |= FTS_PHYSICAL; in b_cp()
757 state->preserve = PRESERVE_IDS|PRESERVE_PERM|PRESERVE_TIME; in b_cp()
758 state->recursive = 1; in b_cp()
770 state->preserve |= PRESERVE_IDS|PRESERVE_PERM|PRESERVE_TIME; in b_cp()
773 state->preserve |= PRESERVE_IDS; in b_cp()
776 state->preserve |= PRESERVE_PERM; in b_cp()
779 state->preserve |= PRESERVE_TIME; in b_cp()
789 state->backup = 1; in b_cp()
792 state->force = 1; in b_cp()
793 if (state->op != CP || !standard) in b_cp()
794 state->interactive = 0; in b_cp()
797 state->hierarchy = 1; in b_cp()
800 state->interactive = 1; in b_cp()
801 if (state->op != CP || !standard) in b_cp()
802 state->force = 0; in b_cp()
805 state->op = LN; in b_cp()
806 state->link = link; in b_cp()
807 state->stat = lstat; in b_cp()
810 state->preserve = PRESERVE_IDS|PRESERVE_PERM|PRESERVE_TIME; in b_cp()
813 state->recursive = 1; in b_cp()
818 state->op = LN; in b_cp()
819 state->link = pathsetlink; in b_cp()
820 state->stat = lstat; in b_cp()
823 state->update = 1; in b_cp()
826 state->verbose = 1; in b_cp()
829 state->flags |= FTS_XDEV; in b_cp()
833 state->backup = 1; in b_cp()
837 state->sync = 1; in b_cp()
843 state->flags |= FTS_META|FTS_PHYSICAL; in b_cp()
847 state->flags &= ~FTS_PHYSICAL; in b_cp()
851 state->flags &= ~FTS_META; in b_cp()
852 state->flags |= FTS_PHYSICAL; in b_cp()
856 state->recursive = 1; in b_cp()
857 state->flags &= ~FTS_META; in b_cp()
858 state->flags |= FTS_PHYSICAL; in b_cp()
862 state->suffix = opt_info.arg; in b_cp()
865 state->remove = 1; in b_cp()
889 state->wflags |= O_EXCL; in b_cp()
896 if (state->backup) in b_cp()
899 state->backup = 0; in b_cp()
911 state->backup = BAK_existing; in b_cp()
923 state->backup = BAK_simple; in b_cp()
931 state->backup = 0; in b_cp()
939 state->backup = BAK_number; in b_cp()
946 if (!state->suffix && !(state->suffix = getenv("SIMPLE_BACKUP_SUFFIX"))) in b_cp()
947 state->suffix = "~"; in b_cp()
948 state->suflen = strlen(state->suffix); in b_cp()
953 state->flags |= fts_flags() | FTS_META; in b_cp()
965 if (!(state->directory = !stat(file, &st) && S_ISDIR(st.st_mode)) && argc > 1) in b_cp()
967 if (s && !state->directory) in b_cp()
969 if ((state->fs3d = fs3d(FS3D_TEST)) && strmatch(file, "...|*/...|.../*")) in b_cp()
970 state->official = 1; in b_cp()
971 state->postsiz = strlen(file); in b_cp()
972 …if (state->pathsiz < roundof(state->postsiz + 2, PATH_CHUNK) && !(state->path = newof(state->path,… in b_cp()
974 memcpy(state->path, file, state->postsiz + 1); in b_cp()
975 if (state->directory && state->path[state->postsiz - 1] != '/') in b_cp()
976 state->path[state->postsiz++] = '/'; in b_cp()
977 if (state->hierarchy) in b_cp()
979 if (!state->directory) in b_cp()
981 state->missmode = st.st_mode; in b_cp()
983 state->perm = state->uid ? S_IPERM : (S_IPERM & ~S_ISVTX); in b_cp()
984 if (!state->recursive) in b_cp()
985 state->flags |= FTS_TOP; in b_cp()
986 if (fts = fts_open(argv, state->flags, NiL)) in b_cp()
988 while (!sh_checksig(context) && (ent = fts_read(fts)) && !visit(state, ent)); in b_cp()
991 else if (state->link != pathsetlink) in b_cp()
992 switch (state->op) in b_cp()
1004 else if ((*state->link)(*argv, state->path)) in b_cp()
1005 error(ERROR_SYSTEM|2, "%s: cannot link to %s", *argv, state->path); in b_cp()
1008 if (state->path) in b_cp()
1009 free(state->path); in b_cp()
1010 free(state); in b_cp()