diff -urN e2fsimage-0.2.2.orig/src/e2fsimage.h e2fsimage-0.2.2/src/e2fsimage.h --- e2fsimage-0.2.2.orig/src/e2fsimage.h 2006-01-12 00:08:58 +0200 +++ e2fsimage-0.2.2/src/e2fsimage.h 2008-02-21 00:34:21 +0200 @@ -113,6 +113,7 @@ ext2_filsys fs; ext2_ino_t curr_e2dir; const char *curr_path; + const char *root_path; inodb_t *ino_db; uiddb_t *uid_db; diff -urN e2fsimage-0.2.2.orig/src/main.c e2fsimage-0.2.2/src/main.c --- e2fsimage-0.2.2.orig/src/main.c 2006-01-11 23:57:27 +0200 +++ e2fsimage-0.2.2/src/main.c 2008-02-21 00:33:31 +0200 @@ -129,7 +129,7 @@ case 'u': e2c.default_uid = atoi(optarg); break; case 'g': e2c.default_gid = atoi(optarg); break; case 'f': e2fsfile = optarg; break; - case 'd': e2c.curr_path = optarg; break; + case 'd': e2c.root_path = e2c.curr_path = optarg; break; case 'h': usage(argv[0]); return 0; case 'n': create = 0; break; case 's': ksize = getsize(optarg); break; diff -urN e2fsimage-0.2.2.orig/src/symlink.c e2fsimage-0.2.2/src/symlink.c --- e2fsimage-0.2.2.orig/src/symlink.c 2005-05-25 21:06:52 +0300 +++ e2fsimage-0.2.2/src/symlink.c 2008-02-21 00:37:06 +0200 @@ -56,6 +56,8 @@ struct ext2_inode inode; int ret, written; char buf[SYM_BUF_SIZE]; + char * root_ptr; + char *tmpptr; off_t size = 0; struct stat s; @@ -74,6 +76,30 @@ /* populate the new inode */ ext2fs_inode_alloc_stats(e2c->fs, e2ino, 1); + + /* open the source file */ + size = readlink(e2c->curr_path, buf, SYM_BUF_SIZE); + if (size < 0 || size >= SYM_BUF_SIZE) { + fprintf(stderr, "Error reading symlink '%s': %s\n", e2c->curr_path, strerror(errno)); + return -1; + } + + e2c->cnt->softln++; + + if (e2c->root_path != NULL) { + root_ptr = strstr(buf, e2c->root_path); + if (root_ptr != buf) { + tmpptr = buf; + } else { + tmpptr = buf + strlen(e2c->root_path); + } + strcpy(buf, tmpptr); + } + + if (e2c->verbose) + printf("Copying symlink %s -> %s\n",e2c->curr_path,buf); + + s.st_size = strlen(buf); init_inode(e2c, &inode, &s); @@ -91,12 +117,23 @@ return -1; } + e2c->cnt->softln++; + + if (e2c->root_path != NULL) { + root_ptr = strstr(buf, e2c->root_path); + if (root_ptr != buf) { + tmpptr = buf; + } else { + tmpptr = buf + strlen(e2c->root_path); + } + strcpy(buf, tmpptr); + } + if (e2c->verbose) - printf("Copying symlink %s\n",e2c->curr_path); + printf("Copying symlink %i %i %s -> %s\n",strlen(buf), size, e2c->curr_path,buf); - e2c->cnt->softln++; - ret = ext2fs_file_write(e2file, buf, size, &written); + ret = ext2fs_file_write(e2file, buf, strlen(buf), &written); if (ret) { fprintf(stderr, "Error writing ext2 symlink (%s)\n", error_message(ret)); ext2fs_file_close(e2file); @@ -106,7 +143,7 @@ ext2fs_file_close(e2file); /* if this sizes differ its an inconsistency in the base filesystem */ - if (size != written) { + if (strlen(buf) != written) { fprintf(stderr, "Error 'size matters' Size:%ld, Written:%d\n", size, written); return -1; }