- if (found) {
- strcpy(dblock.dbuf.linkname, lp->pathname);
- dblock.dbuf.linkflag = '1';
- sprintf(dblock.dbuf.chksum, "%6o", checksum());
- writetape( (char *) &dblock);
- if (vflag) {
- fprintf(stderr, "a %s ", longname);
- fprintf(stderr, "link to %s\n", lp->pathname);
- }
- lp->count--;
- close(infile);
+ strcpy(dblock.dbuf.name, longname);
+ if (stbuf.st_size + 1 >= NAMSIZ) {
+ fprintf(stderr, "tar: %s: symbolic link too long\n",
+ longname);
+ return;
+ }
+ i = readlink(shortname, dblock.dbuf.linkname, NAMSIZ - 1);
+ if (i < 0) {
+ perror(longname);
+ return;
+ }
+ dblock.dbuf.linkname[i] = '\0';
+ dblock.dbuf.linkflag = '2';
+ if (vflag) {
+ fprintf(stderr, "a %s ", longname);
+ fprintf(stderr, "symbolic link to %s\n",
+ dblock.dbuf.linkname);
+ }
+ sprintf(dblock.dbuf.size, "%11lo", 0);
+ sprintf(dblock.dbuf.chksum, "%6o", checksum());
+ writetape((char *)&dblock);
+ break;
+
+ case S_IFREG:
+ if ((infile = open(shortname, 0)) < 0) {
+ fprintf(stderr, "tar: %s: cannot open file\n", longname);
+ return;
+ }
+ tomodes(&stbuf);
+ if (strlen(longname) >= NAMSIZ) {
+ fprintf(stderr, "tar: %s: file name too long\n",
+ longname);