Removed more code redundancies and fd leak with Xorriso_obtain_pattern_files_x()
This commit is contained in:
155
test/xorriso.c
155
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; i<filec; i++) {
|
||||
if(filev[i][0]!='/') {
|
||||
strcpy(path, xorriso->wdx);
|
||||
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; i<filec && !(xorriso->request_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));
|
||||
|
Reference in New Issue
Block a user