Magellan Linux

Annotation of /trunk/mkinitrd-magellan/klibc/usr/utils/ln.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 532 - (hide annotations) (download)
Sat Sep 1 22:45:15 2007 UTC (16 years, 9 months ago) by niro
File MIME type: text/plain
File size: 1282 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd

1 niro 532 #include <stdio.h>
2     #include <stdlib.h>
3     #include <string.h>
4     #include <sys/types.h>
5     #include <sys/stat.h>
6     #include <unistd.h>
7    
8     #include <linux/limits.h>
9    
10     int main(int argc, char *argv[])
11     {
12     int c, s, f;
13     char *p;
14     struct stat sb;
15    
16     s = f = 0;
17     do {
18     c = getopt(argc, argv, "sf");
19     if (c == EOF)
20     break;
21    
22     switch (c) {
23    
24     case 's':
25     s = 1;
26     break;
27     case 'f':
28     f = 1;
29     break;
30     case '?':
31     fprintf(stderr, "%s: invalid option -%c\n",
32     argv[0], optopt);
33     return 1;
34     }
35    
36     } while (1);
37    
38     if (optind == argc) {
39     fprintf(stderr, "Usage: %s [-s] [-f] target link\n", argv[0]);
40     return 1;
41     }
42    
43     memset(&sb, 0, sizeof(struct stat));
44     if (stat(argv[argc - 1], &sb) < 0 && argc - optind > 2) {
45     if (!(S_ISDIR(sb.st_mode))) {
46     fprintf(stderr,
47     "multiple targets and %s is not a directory\n",
48     argv[argc - 1]);
49     return 1;
50     }
51     }
52    
53     for (c = optind; c < argc - 1; c++) {
54     char target[PATH_MAX];
55    
56     p = strrchr(argv[c], '/');
57     p++;
58    
59     if (S_ISDIR(sb.st_mode))
60     snprintf(target, PATH_MAX, "%s/%s", argv[argc - 1], p);
61     else
62     snprintf(target, PATH_MAX, "%s", argv[argc - 1]);
63    
64     if (f)
65     unlink(target);
66    
67     if (s) {
68     if (symlink(argv[c], target) == -1)
69     perror(target);
70     } else {
71     if (link(argv[c], target) == -1)
72     perror(target);
73     }
74     }
75    
76     return 0;
77     }