- argc--, argv++;
-again:
- if (argc && strcmp(argv[0], "-f") == 0) {
- fflag++;
- argv++;
- argc--;
- }
- if (argc && strcmp(argv[0], "-s") == 0) {
- sflag++;
- argv++;
- argc--;
- }
- if (argc == 0)
- goto usage;
- else if (argc == 1) {
- argv[argc] = ".";
- argc++;
- }
- if (sflag == 0 && argc > 2) {
- if (stat(argv[argc-1], &stb) < 0)
- goto usage;
- if ((stb.st_mode&S_IFMT) != S_IFDIR)
- goto usage;
+ while ((ch = getopt(argc, argv, "Fs")) != EOF)
+ switch((char)ch) {
+ case 'F':
+ dirflag = 1;
+ break;
+ case 's':
+ sflag = 1;
+ break;
+ case '?':
+ 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));
+ default: /* ln target1 target2 directory */
+ sourcedir = argv[argc - 1];
+ if (stat(sourcedir, &buf)) {
+ (void)fprintf(stderr,
+ "ln: %s: %s\n", sourcedir, strerror(errno));
+ exit(1);
+ }
+ if (!S_ISDIR(buf.st_mode))
+ usage();
+ for (exitval = 0; *argv != sourcedir; ++argv)
+ exitval |= linkit(*argv, sourcedir, 1);
+ exit(exitval);