+ 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);
+ return;
+ }
+ strcpy(dblock.dbuf.name, longname);
+ if (stbuf.st_nlink > 1) {
+ struct linkbuf *lp;
+ int found = 0;
+
+ for (lp = ihead; lp != NULL; lp = lp->nextp)
+ if (lp->inum == stbuf.st_ino &&
+ lp->devnum == stbuf.st_dev) {
+ found++;
+ break;
+ }
+ 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);
+ return;
+ }