From 6a33fc6b52c81755140c95896850c7cd9122b1bb Mon Sep 17 00:00:00 2001 From: Thomas Schmitt Date: Sun, 21 Oct 2007 12:42:27 +0000 Subject: [PATCH] Began to implement -ls and -ls_l, enhanced -cdi, not done yet --- test/xorriso.c | 29 +++++---- test/xorriso_timestamp.h | 2 +- test/xorrisoburn.c | 137 ++++++++++++++++++++++++++++++++++++--- test/xorrisoburn.h | 3 + 4 files changed, 150 insertions(+), 21 deletions(-) diff --git a/test/xorriso.c b/test/xorriso.c index cf2e4928..6a98dabf 100644 --- a/test/xorriso.c +++ b/test/xorriso.c @@ -3243,7 +3243,7 @@ int Xorriso_option_blank(struct XorrisO *xorriso, char *mode, int flag) /* Option -cd alias -cdi */ int Xorriso_option_cdi(struct XorrisO *xorriso, char *iso_rr_path, int flag) { - char sfe[4*SfileadrL]; + char sfe[4*SfileadrL], path[SfileadrL]; int ret, l; if (strlen(iso_rr_path)>sizeof(xorriso->wdi)) { @@ -3260,18 +3260,25 @@ int Xorriso_option_cdi(struct XorrisO *xorriso, char *iso_rr_path, int flag) strcpy(xorriso->wdi,""); Xorriso_option_pwdi(xorriso, 0); return(1); + } if(iso_rr_path[0]!='/') { + strcpy(path, xorriso->wdi); + if(Sfile_add_to_path(path,iso_rr_path,0)<=0) + return(-1); + } else { + if(Sfile_str(path,iso_rr_path,0)<=0) + return(-1); } ret= 1; - /* >>> LIBISOFS: check whether directory exists in ISO image */; - + ret= Xorriso_ls(xorriso, 2); /* check existence */ if(ret<=0) { sprintf(xorriso->info_text, - "-cdi: not found or not a directory :\n%s",iso_rr_path); + "-cdi: not found or not a directory : %s", + Text_shellsafe(iso_rr_path, sfe, 0)); Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); return(0); } - if(Sfile_str(xorriso->wdi,iso_rr_path,0)<=0) + if(Sfile_str(xorriso->wdi,path,0)<=0) return(-1); l= strlen(xorriso->wdi); while(l>0) @@ -3963,15 +3970,15 @@ int Xorriso_option_j_capital(struct XorrisO *xorriso, int flag) /* @param flag bit0= long format (-ls_l) */ int Xorriso_option_lsi(struct XorrisO *xorriso, char *pattern, int flag) { - char sfe[4*SfileadrL]; + int ret; + + if(strcmp(pattern,"*")!=0 && pattern[0]) + fprintf(stderr, ">>> XORRISO : TODO : filter by pattern %s\n", pattern); - fprintf(stderr, ">>> XORRISO : filter by pattern %s\n", pattern); /* >>> prepare regex */ - fprintf(stderr, ">>> LIBISOFS : -ls of ISO directory %s\n", - Text_shellsafe(xorriso->wdi, sfe, 0)); - - return(1); + ret= Xorriso_ls(xorriso, flag&1); + return(ret); } diff --git a/test/xorriso_timestamp.h b/test/xorriso_timestamp.h index cb82fcc4..0c33ef83 100644 --- a/test/xorriso_timestamp.h +++ b/test/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2007.10.21.105228" +#define Xorriso_timestamP "2007.10.21.124315" diff --git a/test/xorrisoburn.c b/test/xorrisoburn.c index 869b7af4..b16e2dae 100644 --- a/test/xorrisoburn.c +++ b/test/xorrisoburn.c @@ -989,8 +989,28 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag) } +int Xorriso_node_from_path(struct XorrisO *xorriso, struct iso_volume *volume, + char *path, struct iso_tree_node **node, int flag) +{ + char sfe[4*SfileadrL]; + + *node= iso_tree_volume_path_to_node(volume, path); + Xorriso_process_msg_queues(xorriso,0); + if(*node==NULL) { + sprintf(xorriso->info_text, "Cannot find path %s in loaded ISO image", + Text_shellsafe(path, sfe, 0)); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + return(0); + } + return(1); +} + + /* @param flag bit0= remove whole sub tree: rm -r - bit1=remove empty directory: rmdir + bit1=remove empty directory: rmdir + @return <=0 = error + 1 = removed simple node + 2 = removed directory or tree */ int Xorriso_rmi(struct XorrisO *xorriso, char *path, int flag) { @@ -1010,14 +1030,9 @@ int Xorriso_rmi(struct XorrisO *xorriso, char *path, int flag) Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); return(0); } - victim_node= iso_tree_volume_path_to_node(volume, path); - Xorriso_process_msg_queues(xorriso,0); - if(victim_node==NULL) { - sprintf(xorriso->info_text, "Cannot find path %s in loaded ISO image", - Text_shellsafe(path, sfe, 0)); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); - return(0); - } + ret= Xorriso_node_from_path(xorriso, volume, path, &victim_node, 0); + if(ret<=0) + return(ret); if(LIBISO_ISDIR(victim_node)) is_dir= 1; @@ -1074,4 +1089,108 @@ int Xorriso_rmi(struct XorrisO *xorriso, char *path, int flag) } +/* @param flag bit0= long format , bit1= only check for directory existence */ +int Xorriso_ls(struct XorrisO *xorriso, int flag) +{ + int ret, is_dir= 0; + struct iso_tree_node *node; + struct iso_tree_node_dir *dir_node; + struct iso_volume *volume; + struct iso_tree_iter *iter; + char sfe[4*SfileadrL], *npt, *rpt, perms[10]; + mode_t st_mode; + + rpt= xorriso->result_line; + + ret= Xorriso_get_volume(xorriso, &volume, 0); + if(ret<=0) + return(ret); + + ret= Xorriso_node_from_path(xorriso, volume, xorriso->wdi, &node, 0); + if(ret<=0) + goto wdi_is_not_a_dir; + if(LIBISO_ISDIR(node)) + is_dir= 1; + if(!is_dir) { +wdi_is_not_a_dir:; + sprintf(xorriso->info_text, + "Working directory path does not lead to a directory in ISO image"); + Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); + return(0); + } + if(flag&2) + return(1); + + dir_node= (struct iso_tree_node_dir *) node; + iter= iso_tree_node_children(dir_node); + Xorriso_process_msg_queues(xorriso,0); + + /* ??? >>> is the iteration sorted by name ? */ + /* if not: >>> copy to char * array */ + + while((node= iso_tree_iter_next(iter)) != NULL ) { + npt= (char *) iso_tree_node_get_name(node); + +#ifdef Xorriso_with_regeX + if(xorriso->re!=NULL) { + /* >>> test with regex */; + } +#endif /* Xorriso_with_regeX */ + + rpt[0]= 0; + + if(flag&1) { + + /* >>> prepend attribute info */; + + if(is_dir) + strcat(rpt, "d"); + else if(LIBISO_ISREG(node)) + strcat(rpt, "-"); + else if(LIBISO_ISLNK(node)) + strcat(rpt, "l"); + else + strcat(rpt, "?"); + + st_mode= iso_tree_node_get_permissions(node); + strcpy(perms,"---------"); + if(st_mode&S_IRUSR) perms[0]= 'r'; + if(st_mode&S_IWUSR) perms[1]= 'w'; + if(st_mode&S_IXUSR) perms[2]= 'x'; + if(st_mode&S_IRGRP) perms[3]= 'r'; + if(st_mode&S_IWGRP) perms[4]= 'w'; + if(st_mode&S_IXGRP) perms[5]= 'x'; + if(st_mode&S_IROTH) perms[6]= 'r'; + if(st_mode&S_IWOTH) perms[7]= 'w'; + if(st_mode&S_IXOTH) perms[8]= 'x'; + strcat(rpt, perms); + + /* >>> With directories this should be : number of subdirs + 2 */ + /* >>> ??? How to obtain RR harlink number for other types ? */ + strcat(rpt," 1 "); + + sprintf(rpt+strlen(rpt), "%7lu ", + (unsigned long) iso_tree_node_get_uid(node)); + sprintf(rpt+strlen(rpt), "%7lu ", + (unsigned long) iso_tree_node_get_gid(node)); + + /* >>> obtain size */ + sprintf(rpt+strlen(rpt), "_no_size "); + /* >>> obtain date */ + sprintf(rpt+strlen(rpt), "__no__date__ "); + + } + sprintf(xorriso->result_line+strlen(xorriso->result_line), "%s\n", + Text_shellsafe(npt, sfe, 0)); + Xorriso_result(xorriso, 0); + } + + /* ??? >>> sort */ + + /* ??? >>> output loop */ + + Xorriso_process_msg_queues(xorriso,0); + return(1); +} + diff --git a/test/xorrisoburn.h b/test/xorrisoburn.h index 1d80d2c7..633df914 100644 --- a/test/xorrisoburn.h +++ b/test/xorrisoburn.h @@ -54,6 +54,9 @@ int Xorriso_format_media(struct XorrisO *xorriso, int flag); */ int Xorriso_rmi(struct XorrisO *xorriso, char *path, int flag); +/* @param flag bit0= long format , bit1= only check for directory existence */ +int Xorriso_ls(struct XorrisO *xorriso, int flag); + #endif /* Xorrisoburn_includeD */