diff --git a/test/xorriso.c b/test/xorriso.c index 5867f94d..ae0fc1b8 100644 --- a/test/xorriso.c +++ b/test/xorriso.c @@ -2013,10 +2013,10 @@ int Dirseq_next_adrblock(struct DirseQ *o, char *replies[], int *reply_count, int Dirseq_new(struct DirseQ **o, char *adr, int flag) /* - bit0= do not complain about failed opendir() + bit0= with non-fatal errors do not complain about failed opendir() */ { - int ret,i; + int ret,i,severe_error; struct DirseQ *m; m= *o= TSOB_FELD(struct DirseQ,1); @@ -2043,9 +2043,11 @@ int Dirseq_new(struct DirseQ **o, char *adr, int flag) else m->dirpt= opendir(adr); if(m->dirpt==NULL) { - if(!(flag&1)) + severe_error= (errno && errno!=ENOENT && errno!=EACCES && errno!=ENOTDIR); + if(severe_error || !(flag&1)) fprintf(stderr,"opendir(%s) failed : %s\n",adr,strerror(errno)); - ret= 0; goto failed; + ret= -severe_error; + goto failed; } return(1); failed:; @@ -2679,7 +2681,7 @@ klammer_affe:; } else { /* >>> unknown input */ sprintf(xorriso->info_text, - "--- Please enter one of : empty line, i,n, r,y, q,x, @, @@, @@@\n"); + "--- Please enter one of : empty line, i,n, r,y, q,x, @, @@@\n"); Xorriso_info(xorriso,0); return(3); } @@ -2696,7 +2698,7 @@ klammer_affe:; } else if(*cpt!=0) { Xorriso_dialog_input(xorriso,cpt,strlen(line)+1,2); /* write to history */ sprintf(xorriso->info_text, - "--- Please enter one of : empty line, @, @@, @@@\n"); + "--- Please enter one of : empty line, @, @@@\n"); Xorriso_info(xorriso,0); return(3); } @@ -3669,12 +3671,13 @@ int Xorriso_check_for_root_pattern(struct XorrisO *xorriso, } -/* @param flag bit2= prepend wd (automatically done if wd[0]!=0) +/* @param flag bit0= prepend wd only if name does not begin by '/' + bit2= prepend wd (automatically done if wd[0]!=0) */ int Xorriso_make_pattern_adr(struct XorrisO *xorriso, char *wd, char *name, char adr[], int flag) { - if(wd[0]!=0 || (flag&4)) { + if((wd[0]!=0 || (flag&4)) && !((flag&1) && name[0]=='/')) { if(strlen(wd)+1>=SfileadrL) goto much_too_long; strcpy(adr, wd); @@ -3798,6 +3801,7 @@ int Xorriso_obtain_pattern_files_x( } ret= 1; ex:; + Dirseq_destroy(&dirseq,0); if(flag&2) (*dive_count)--; return(ret); @@ -4588,6 +4592,58 @@ int Xorriso__mode_to_perms(mode_t st_mode, char perms[10], int flag) } +int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag) +{ + char *rpt, perms[10]; + mode_t st_mode; + time_t mtime; + struct tm tms, *tmpt; + static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + + rpt= xorriso->result_line; + rpt[0]= 0; + st_mode= stbuf->st_mode; + + if(S_ISDIR(st_mode)) + strcat(rpt, "d"); + else if(S_ISREG(st_mode)) + strcat(rpt, "-"); + else if(S_ISLNK(st_mode)) + strcat(rpt, "l"); + else if(S_ISBLK(st_mode)) + strcat(rpt, "b"); + else if(S_ISCHR(st_mode)) + strcat(rpt, "c"); + else if(S_ISFIFO(st_mode)) + strcat(rpt, "p"); + else if(S_ISSOCK(st_mode)) + strcat(rpt, "s"); + else + strcat(rpt, "?"); + + Xorriso__mode_to_perms(st_mode, perms, 0); + strcat(rpt, perms); + + sprintf(rpt+strlen(rpt),"%4u ",(unsigned int) stbuf->st_nlink); + + sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf->st_uid); + sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf->st_gid); + sprintf(rpt+strlen(rpt), "%8.f ", (double) stbuf->st_size); + mtime= stbuf->st_mtime; + tmpt= localtime_r(&mtime, &tms); + if(tmpt==0) + sprintf(rpt+strlen(rpt), "%12.f ",(double) mtime); + else if(time(NULL)-mtime < 180*86400 && time(NULL)-mtime >= 0) + sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d ", + months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min); + else + sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ", + months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year); + return(1); +} + + /* @param flag bit0= long format bit1= do not print count of nodes bit2= du format @@ -4596,14 +4652,9 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, int filec, char **filev, off_t boss_mem, int flag) { int i, ret, was_error= 0; - char sfe[5*SfileadrL], path[SfileadrL], *rpt, perms[10]; - mode_t st_mode; + char sfe[5*SfileadrL], path[SfileadrL], *rpt; off_t size; - time_t mtime; - struct tm tms, *tmpt; struct stat stbuf; - static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; rpt= xorriso->result_line; @@ -4611,21 +4662,11 @@ int Xorriso_lsx_filev(struct XorrisO *xorriso, int filec, char **filev, /* Count valid nodes, warn of invalid ones */ for(i= 0; iwdx); - if(Sfile_add_to_path(path, filev[i], 0)<=0) { -much_too_long:; - sprintf(xorriso->info_text, - "Path for file listing gets much too long (%d)", - (int) (strlen(path)+strlen(filev[i])+1)); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); - was_error++; + ret= Xorriso_make_pattern_adr(xorriso, xorriso->wdx, filev[i], path, 1|4); + if(ret<=0) { + was_error++; continue; - } - } else - if(Sfile_str(path, filev[i], 0)<=0) - goto much_too_long; - + } if(xorriso->do_follow_links) ret= stat(path, &stbuf); else @@ -4647,64 +4688,23 @@ much_too_long:; } for(i= 0; irequest_to_abort); i++) { - if(filev[i][0]!='/') { - strcpy(path, xorriso->wdx); - if(Sfile_add_to_path(path, filev[i], 0)<=0) + ret= Xorriso_make_pattern_adr(xorriso, xorriso->wdx, filev[i], path, 1|4); + if(ret<=0) continue; - } else - if(Sfile_str(path, filev[i], 0)<=0) - continue; - if(xorriso->do_follow_links) ret= stat(path, &stbuf); else ret= lstat(path, &stbuf); if(ret==-1) continue; - - size= stbuf.st_size; rpt[0]= 0; - st_mode= stbuf.st_mode; - if((flag&5)==1) { /* -ls_lx */ - if(S_ISDIR(st_mode)) - strcat(rpt, "d"); - else if(S_ISREG(st_mode)) - strcat(rpt, "-"); - else if(S_ISLNK(st_mode)) - strcat(rpt, "l"); - else if(S_ISBLK(st_mode)) - strcat(rpt, "b"); - else if(S_ISCHR(st_mode)) - strcat(rpt, "c"); - else if(S_ISFIFO(st_mode)) - strcat(rpt, "p"); - else if(S_ISSOCK(st_mode)) - strcat(rpt, "s"); - else - strcat(rpt, "?"); - - Xorriso__mode_to_perms(st_mode, perms, 0); - strcat(rpt, perms); - - sprintf(rpt+strlen(rpt),"%4u ",(unsigned int) stbuf.st_nlink); - - sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf.st_uid); - sprintf(rpt+strlen(rpt), "%-8lu ", (unsigned long) stbuf.st_gid); - sprintf(rpt+strlen(rpt), "%8.f ",(double) size); - mtime= stbuf.st_mtime; - tmpt= localtime_r(&mtime, &tms); - if(tmpt==0) - sprintf(rpt+strlen(rpt), "%12.f ",(double) mtime); - else if(time(NULL)-mtime < 180*86400 && time(NULL)-mtime >= 0) - sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d ", - months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min); - else - sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ", - months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year); - + if((flag&5)==1) { + ret= Xorriso_format_ls_l(xorriso, &stbuf, 0); + if(ret<=0) + continue; } else if(flag&4) { /* -du or -du_s */ - - if(S_ISDIR(st_mode)) { + size= stbuf.st_size; + if(S_ISDIR(stbuf.st_mode)) { ret= Xorriso_show_dux_subs(xorriso, path, filev[i], &size, boss_mem, flag&1); if(ret<0) @@ -4713,7 +4713,6 @@ much_too_long:; continue; } sprintf(rpt, "%7.f ",(double) (size/1024)); - } sprintf(xorriso->result_line+strlen(xorriso->result_line), "%s\n", Text_shellsafe(filev[i], sfe, 0)); diff --git a/test/xorriso_private.h b/test/xorriso_private.h index 00bb77cd..0babf404 100644 --- a/test/xorriso_private.h +++ b/test/xorriso_private.h @@ -6,7 +6,8 @@ Provided under GPL version 2. - This file contains the inner description of xorriso. + This file contains inner declarations of xorriso. + The public interface is in xorriso.h */ @@ -239,6 +240,7 @@ int Xorriso_register_matched_adr(struct XorrisO *xorriso, char *adr, int count_limit, int *filec, char **filev, off_t *mem, int flag); +int Xorriso_format_ls_l(struct XorrisO *xorriso, struct stat *stbuf, int flag); int Sfile_str(char target[SfileadrL], char *source, int flag); diff --git a/test/xorriso_timestamp.h b/test/xorriso_timestamp.h index 02837e10..0ef6f975 100644 --- a/test/xorriso_timestamp.h +++ b/test/xorriso_timestamp.h @@ -1 +1 @@ -#define Xorriso_timestamP "2007.12.06.192437" +#define Xorriso_timestamP "2007.12.08.175117" diff --git a/test/xorrisoburn.c b/test/xorrisoburn.c index a569e5df..0992a629 100644 --- a/test/xorrisoburn.c +++ b/test/xorrisoburn.c @@ -1246,7 +1246,7 @@ int Xorriso_toc(struct XorrisO *xorriso, int flag) if(xorriso->request_to_abort) return(1); Sfile_scale(((double) num_data) * 2048.0, mem_text,5,1e4,1); - sprintf(respt, "Media summary: %d session%s, %d data blocks (%s)\n", + sprintf(respt, "Media summary: %d session%s, %d data blocks, %s\n", num_sessions, (num_sessions==1 ? "" : "s"), num_data, mem_text); Xorriso_result(xorriso,0); @@ -1862,6 +1862,57 @@ ex:; } +/* @param flag bit0= *node is already valid */ +int Xorriso_fake_stbuf(struct XorrisO *xorriso, char *path, struct stat *stbuf, + struct iso_tree_node **node, int flag) +{ + int ret; + struct iso_volume *volume; + + if(!(flag&1)) { + ret= Xorriso_get_volume(xorriso, &volume, 0); + if(ret<=0) + return(-1); + memset((char *) stbuf, 0, sizeof(struct stat)); + *node= iso_tree_volume_path_to_node(volume,path); + } + if(*node==NULL) + return(0); + + /* >>> stbuf->st_dev */ + /* >>> stbuf->st_ino */ + + stbuf->st_mode= iso_tree_node_get_permissions(*node); + if(LIBISO_ISDIR(*node)) + stbuf->st_mode|= S_IFDIR; + else if(LIBISO_ISREG(*node)) + stbuf->st_mode|= S_IFREG; + else if(LIBISO_ISLNK(*node)) + stbuf->st_mode|= S_IFLNK; + + /* >>> With directories this should be : number of subdirs + 2 */ + /* >>> ??? How to obtain RR hardlink number for other types ? */ + stbuf->st_nlink= 1; + + stbuf->st_uid= iso_tree_node_get_uid(*node); + stbuf->st_gid= iso_tree_node_get_gid(*node); + + /* >>> stbuf->st_rdev */ + + stbuf->st_size= iso_tree_node_get_size(*node); + + stbuf->st_blksize= 2048; + stbuf->st_blocks= stbuf->st_size / (off_t) 2048; + if(stbuf->st_blocks * (off_t) 2048 != stbuf->st_size) + stbuf->st_blocks++; + + stbuf->st_atime= iso_tree_node_get_atime(*node); + stbuf->st_mtime= iso_tree_node_get_mtime(*node); + stbuf->st_ctime= iso_tree_node_get_ctime(*node); + return(1); +} + + /* @param flag bit0= long format bit1= do not print count of nodes bit2= du format @@ -1872,13 +1923,9 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, int filec, char **filev, int i, ret, was_error= 0; struct iso_tree_node *node; struct iso_volume *volume; - char sfe[5*SfileadrL], path[SfileadrL], *rpt, perms[10]; - mode_t st_mode; + char sfe[5*SfileadrL], path[SfileadrL], *rpt; off_t size; - time_t mtime; - struct tm tms, *tmpt; - static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + struct stat stbuf; rpt= xorriso->result_line; @@ -1890,21 +1937,11 @@ int Xorriso_ls_filev(struct XorrisO *xorriso, int filec, char **filev, /* Count valid nodes, warn of invalid ones */ for(i= 0; iwdi); - if(Sfile_add_to_path(path, filev[i], 0)<=0) { -much_too_long:; - sprintf(xorriso->info_text, - "Path for file listing gets much too long (%d)", - (int) (strlen(path)+strlen(filev[i])+1)); - Xorriso_msgs_submit(xorriso, 0, xorriso->info_text, 0, "SORRY", 0); - was_error++; + ret= Xorriso_make_pattern_adr(xorriso, xorriso->wdi, filev[i], path, 1|4); + if(ret<=0) { + was_error++; continue; - } - } else - if(Sfile_str(path, filev[i], 0)<=0) - goto much_too_long; - + } node= iso_tree_volume_path_to_node(volume,path); if(node==NULL) { sprintf(xorriso->info_text, "Not found in ISO image: %s", @@ -1923,55 +1960,20 @@ much_too_long:; } for(i= 0; irequest_to_abort); i++) { - if(filev[i][0]!='/') { - strcpy(path, xorriso->wdi); - if(Sfile_add_to_path(path, filev[i], 0)<=0) - continue; - } else - if(Sfile_str(path, filev[i], 0)<=0) - continue; - node= iso_tree_volume_path_to_node(volume,path); - if(node==NULL) - continue; - - size= iso_tree_node_get_size(node); rpt[0]= 0; + ret= Xorriso_make_pattern_adr(xorriso, xorriso->wdi, filev[i], path, 1|4); + if(ret<=0) + continue; + ret= Xorriso_fake_stbuf(xorriso, path, &stbuf, &node, 0); + if(ret<=0) + continue; if((flag&5)==1) { /* -ls_l */ - if(LIBISO_ISDIR(node)) - 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); - Xorriso__mode_to_perms(st_mode, perms, 0); - strcat(rpt, perms); - - /* >>> With directories this should be : number of subdirs + 2 */ - /* >>> ??? How to obtain RR hardlink number for other types ? */ - strcat(rpt," 1 "); - - sprintf(rpt+strlen(rpt), "%-8lu ", - (unsigned long) iso_tree_node_get_uid(node)); - sprintf(rpt+strlen(rpt), "%-8lu ", - (unsigned long) iso_tree_node_get_gid(node)); - sprintf(rpt+strlen(rpt), "%8.f ",(double) size); - mtime= iso_tree_node_get_mtime(node); - tmpt= localtime_r(&mtime, &tms); - if(tmpt==0) - sprintf(rpt+strlen(rpt), "%12.f ",(double) mtime); - else if(time(NULL)-mtime < 180*86400 && time(NULL)-mtime >= 0) - sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d ", - months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min); - else - sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ", - months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year); - + ret= Xorriso_format_ls_l(xorriso, &stbuf, 0); + if(ret<=0) + continue; } else if(flag&4) { /* -du or -du_s */ - if(LIBISO_ISDIR(node)) { + size= stbuf.st_size; + if(S_ISDIR(stbuf.st_mode)) { ret= Xorriso_show_du_subs(xorriso, (struct iso_tree_node_dir *) node, path, filev[i], &size, boss_mem, flag&1); if(ret<0) @@ -1990,7 +1992,8 @@ much_too_long:; /* This function needs less buffer memory than Xorriso_ls_filev() but cannot - perform structured pattern matching. + perform structured pattern matching as done by Xorriso_expand_pattern() + for subsequent Xorriso_ls_filev(). @param flag bit0= long format bit1= only check for directory existence bit2= do not apply search pattern but accept any file @@ -2002,13 +2005,8 @@ int Xorriso_ls(struct XorrisO *xorriso, int flag) struct iso_tree_node_dir *dir_node; struct iso_volume *volume; struct iso_tree_iter *iter= NULL; - char sfe[5*SfileadrL], *npt, *rpt, perms[10]; - mode_t st_mode; - off_t size; - time_t mtime; - struct tm tms, *tmpt; - static char months[12][4]= { "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + char sfe[5*SfileadrL], *npt, *rpt; + struct stat stbuf; rpt= xorriso->result_line; @@ -2077,42 +2075,13 @@ wdi_is_not_a_dir:; npt= (char *) iso_tree_node_get_name(node); rpt[0]= 0; - if(flag&1) { - if(LIBISO_ISDIR(node)) - 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); - Xorriso__mode_to_perms(st_mode, perms, 0); - strcat(rpt, perms); - - /* >>> With directories this should be : number of subdirs + 2 */ - /* >>> ??? How to obtain RR hardlink number for other types ? */ - strcat(rpt," 1 "); - - sprintf(rpt+strlen(rpt), "%-8lu ", - (unsigned long) iso_tree_node_get_uid(node)); - sprintf(rpt+strlen(rpt), "%-8lu ", - (unsigned long) iso_tree_node_get_gid(node)); - size= iso_tree_node_get_size(node); - sprintf(rpt+strlen(rpt), "%8.f ",(double) size); - mtime= iso_tree_node_get_mtime(node); - tmpt= localtime_r(&mtime, &tms); - if(tmpt==0) - sprintf(rpt+strlen(rpt), "%12.f ",(double) mtime); - else if(time(NULL)-mtime < 180*86400 && time(NULL)-mtime >= 0) - sprintf(rpt+strlen(rpt), "%3s %2d %2.2d:%2.2d ", - months[tms.tm_mon], tms.tm_mday, tms.tm_hour, tms.tm_min); - else - sprintf(rpt+strlen(rpt), "%3s %2d %4.4d ", - months[tms.tm_mon], tms.tm_mday, 1900+tms.tm_year); - + ret= Xorriso_fake_stbuf(xorriso, "", &stbuf, &node, 1); + if(ret<=0) + continue; + ret= Xorriso_format_ls_l(xorriso, &stbuf, 0); + if(ret<=0) + continue; } sprintf(xorriso->result_line+strlen(xorriso->result_line), "%s\n", Text_shellsafe(npt, sfe, 0));