#include #include static struct Flags { uchar a : 1; uchar f : 1; uchar p : 1; uchar v : 1; uchar r : 1; } flag; static char follow; static int cp(char *from, char *to) { } /* * P -> never dereference * L -> dereference links * H -> dereference links on the first level */ static void usage(void) { fputs("usage: cp [-afpv] [-[r|R] [-H | -L | -P]] source ... dest", stderr); exit(1); } int main(int argc, char *argv[]) { io·Stat info; ARGBEGIN { case 'a': follow = 'P'; flag.a = flag.p = flag.r = 1; break; case 'f': flag.f = 1; break; case 'p': flag.p = 1; break; case 'r': /* fallthrough */ case 'R': flag.r = 1; break; case 'H': case 'L': case 'P': follow = ARGC(); break; default: usage(); } ARGEND; if (argc < 2) usage(); if (!follow) follow = flag.r ? 'P' : 'L'; if (argc > 2) { if (stat(argv[argc-1], &info) < 0) errorf("stat %s: %s", argv[argc-1], strerror(errno)); if (!S_ISDIR(info.st_mode)) errorf("%s: is not a directory", argv[argc-1]); } }