diff options
Diffstat (limited to 'coreutils/ls.c')
-rw-r--r-- | coreutils/ls.c | 796 |
1 files changed, 441 insertions, 355 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c index 0c2cea1..344f8ff 100644 --- a/coreutils/ls.c +++ b/coreutils/ls.c @@ -42,9 +42,9 @@ */ enum { - TERMINAL_WIDTH = 80, /* use 79 if terminal has linefold bug */ - COLUMN_WIDTH = 14, /* default if AUTOWIDTH not defined */ - COLUMN_GAP = 2, /* includes the file type char */ + TERMINAL_WIDTH = 80, /* use 79 if terminal has linefold bug */ + COLUMN_WIDTH = 14, /* default if AUTOWIDTH not defined */ + COLUMN_GAP = 2, /* includes the file type char */ }; @@ -76,10 +76,10 @@ enum { /* what is the overall style of the listing */ enum { -STYLE_AUTO = 0, -STYLE_LONG = 1, /* one record per line, extended info */ -STYLE_SINGLE = 2, /* one record per line */ -STYLE_COLUMNS = 3 /* fill columns */ + STYLE_AUTO = 0, + STYLE_LONG = 1, /* one record per line, extended info */ + STYLE_SINGLE = 2, /* one record per line */ + STYLE_COLUMNS = 3 /* fill columns */ }; /* 51306 lrwxrwxrwx 1 root root 2 May 11 01:43 /bin/view -> vi* */ @@ -100,7 +100,7 @@ STYLE_COLUMNS = 3 /* fill columns */ #define LIST_EXEC (1<<13) /* what files will be displayed */ -#define DISP_NORMAL (0) /* show normal filenames */ +#define DISP_NORMAL (0) /* show normal filenames */ #define DISP_DIRNAME (1<<0) /* 2 or more items? label directories */ #define DISP_HIDDEN (1<<1) /* show filenames starting with . */ #define DISP_DOT (1<<2) /* show . and .. */ @@ -110,16 +110,16 @@ STYLE_COLUMNS = 3 /* fill columns */ #ifdef CONFIG_FEATURE_LS_SORTFILES /* how will the files be sorted */ -static const int SORT_FORWARD = 0; /* sort in reverse order */ -static const int SORT_REVERSE = 1; /* sort in reverse order */ -static const int SORT_NAME = 2; /* sort by file name */ -static const int SORT_SIZE = 3; /* sort by file size */ -static const int SORT_ATIME = 4; /* sort by last access time */ -static const int SORT_CTIME = 5; /* sort by last change time */ -static const int SORT_MTIME = 6; /* sort by last modification time */ -static const int SORT_VERSION = 7; /* sort by version */ -static const int SORT_EXT = 8; /* sort by file name extension */ -static const int SORT_DIR = 9; /* sort by file or directory */ +static const int SORT_FORWARD = 0; /* sort in reverse order */ +static const int SORT_REVERSE = 1; /* sort in reverse order */ +static const int SORT_NAME = 2; /* sort by file name */ +static const int SORT_SIZE = 3; /* sort by file size */ +static const int SORT_ATIME = 4; /* sort by last access time */ +static const int SORT_CTIME = 5; /* sort by last change time */ +static const int SORT_MTIME = 6; /* sort by last modification time */ +static const int SORT_VERSION = 7; /* sort by version */ +static const int SORT_EXT = 8; /* sort by file name extension */ +static const int SORT_DIR = 9; /* sort by file or directory */ #endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS @@ -129,12 +129,11 @@ static const int TIME_CHANGE = 1; static const int TIME_ACCESS = 2; #endif -#define LIST_SHORT (LIST_FILENAME) -#define LIST_ISHORT (LIST_INO | LIST_FILENAME) -#define LIST_LONG (LIST_MODEBITS | LIST_NLINKS | LIST_ID_NAME | \ - LIST_SIZE | LIST_DATE_TIME | LIST_FILENAME | \ - LIST_SYMLINK) -#define LIST_ILONG (LIST_INO | LIST_LONG) +#define LIST_SHORT (LIST_FILENAME) +#define LIST_ISHORT (LIST_INO | LIST_FILENAME) +#define LIST_LONG (LIST_MODEBITS | LIST_NLINKS | LIST_ID_NAME | LIST_SIZE | \ + LIST_DATE_TIME | LIST_FILENAME | LIST_SYMLINK) +#define LIST_ILONG (LIST_INO | LIST_LONG) static const int SPLIT_DIR = 0; static const int SPLIT_FILE = 1; @@ -142,26 +141,29 @@ static const int SPLIT_SUBDIR = 2; #define TYPEINDEX(mode) (((mode) >> 12) & 0x0f) #define TYPECHAR(mode) ("0pcCd?bB-?l?s???" [TYPEINDEX(mode)]) + #if defined(CONFIG_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR) -#define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)]) +# define APPCHAR(mode) ("\0|\0\0/\0\0\0\0\0@\0=\0\0\0" [TYPEINDEX(mode)]) #endif + /* colored LS support by JaWi, janwillem.janssen@lxtreme.nl */ #ifdef CONFIG_FEATURE_LS_COLOR static int show_color = 0; -#define COLOR(mode) ("\000\043\043\043\042\000\043\043"\ - "\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)]) -#define ATTR(mode) ("\00\00\01\00\01\00\01\00"\ - "\00\00\01\00\01\00\00\01" [TYPEINDEX(mode)]) + +#define COLOR(mode) ("\000\043\043\043\042\000\043\043"\ + "\000\000\044\000\043\000\000\040" [TYPEINDEX(mode)]) +#define ATTR(mode) ("\00\00\01\00\01\00\01\00"\ + "\00\00\01\00\01\00\00\01" [TYPEINDEX(mode)]) #endif /* * a directory entry and its stat info are stored here */ -struct dnode { /* the basic node */ - char *name; /* the dir entry name */ - char *fullname; /* the dir entry name */ - struct stat dstat; /* the file stat info */ - struct dnode *next; /* point at the next node */ +struct dnode { /* the basic node */ + char *name; /* the dir entry name */ + char *fullname; /* the dir entry name */ + struct stat dstat; /* the file stat info */ + struct dnode *next; /* point at the next node */ }; typedef struct dnode dnode_t; @@ -172,6 +174,7 @@ static int list_single(struct dnode *); static unsigned int disp_opts; static unsigned int style_fmt; static unsigned int list_fmt; + #ifdef CONFIG_FEATURE_LS_SORTFILES static unsigned int sort_opts; static unsigned int sort_order; @@ -180,10 +183,11 @@ static unsigned int sort_order; static unsigned int time_fmt; #endif #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS -static unsigned int follow_links=FALSE; +static unsigned int follow_links = FALSE; #endif static unsigned short column = 0; + #ifdef CONFIG_FEATURE_AUTOWIDTH static unsigned short terminal_width = TERMINAL_WIDTH; static unsigned short column_width = COLUMN_WIDTH; @@ -223,10 +227,10 @@ static int my_stat(struct dnode *cur) static void newline(void) { - if (column > 0) { - putchar('\n'); - column = 0; - } + if (column > 0) { + putchar('\n'); + column = 0; + } } /*----------------------------------------------------------------------*/ @@ -234,12 +238,12 @@ static void newline(void) static char fgcolor(mode_t mode) { /* Check wheter the file is existing (if so, color it red!) */ - if ( errno == ENOENT ) { + if (errno == ENOENT) { errno = 0; - return '\037'; + return '\037'; } - if ( LIST_EXEC && S_ISREG( mode ) - && ( mode & ( S_IXUSR | S_IXGRP | S_IXOTH ) ) ) + if (LIST_EXEC && S_ISREG(mode) + && (mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return COLOR(0xF000); /* File is executable ... */ return COLOR(mode); } @@ -247,8 +251,8 @@ static char fgcolor(mode_t mode) /*----------------------------------------------------------------------*/ static char bgcolor(mode_t mode) { - if ( LIST_EXEC && S_ISREG( mode ) - && ( mode & ( S_IXUSR | S_IXGRP | S_IXOTH ) ) ) + if (LIST_EXEC && S_ISREG(mode) + && (mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return ATTR(0xF000); /* File is executable ... */ return ATTR(mode); } @@ -258,29 +262,31 @@ static char bgcolor(mode_t mode) #if defined(CONFIG_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR) static char append_char(mode_t mode) { - if ( !(list_fmt & LIST_FILETYPE)) + if (!(list_fmt & LIST_FILETYPE)) return '\0'; if ((list_fmt & LIST_EXEC) && S_ISREG(mode) - && (mode & (S_IXUSR | S_IXGRP | S_IXOTH))) return '*'; - return APPCHAR(mode); + && (mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return '*'; + return APPCHAR(mode); } #endif /*----------------------------------------------------------------------*/ -static void nexttabstop( void ) +static void nexttabstop(void) { - static short nexttab= 0; - int n=0; + static short nexttab = 0; + int n = 0; if (column > 0) { - n= nexttab - column; - if (n < 1) n= 1; + n = nexttab - column; + if (n < 1) + n = 1; while (n--) { putchar(' '); column++; } } - nexttab= column + column_width + COLUMN_GAP; + nexttab = column + column_width + COLUMN_GAP; } /*----------------------------------------------------------------------*/ @@ -294,19 +300,22 @@ static int countdirs(struct dnode **dn, int nfiles) { int i, dirs; - if (dn==NULL || nfiles < 1) return(0); - dirs= 0; - for (i=0; i<nfiles; i++) { - if (S_ISDIR(dn[i]->dstat.st_mode)) dirs++; + if (dn == NULL || nfiles < 1) + return (0); + dirs = 0; + for (i = 0; i < nfiles; i++) { + if (S_ISDIR(dn[i]->dstat.st_mode)) + dirs++; } - return(dirs); + return (dirs); } static int countsubdirs(struct dnode **dn, int nfiles) { int i, subdirs; - if (dn == NULL || nfiles < 1) return 0; + if (dn == NULL || nfiles < 1) + return 0; subdirs = 0; for (i = 0; i < nfiles; i++) if (is_subdir(dn[i])) @@ -319,11 +328,13 @@ static int countfiles(struct dnode **dnp) int nfiles; struct dnode *cur; - if (dnp == NULL) return(0); - nfiles= 0; - for (cur= dnp[0]; cur->next != NULL ; cur= cur->next) nfiles++; + if (dnp == NULL) + return (0); + nfiles = 0; + for (cur = dnp[0]; cur->next != NULL; cur = cur->next) + nfiles++; nfiles++; - return(nfiles); + return (nfiles); } /* get memory to hold an array of pointers */ @@ -331,10 +342,12 @@ static struct dnode **dnalloc(int num) { struct dnode **p; - if (num < 1) return(NULL); + if (num < 1) + return (NULL); - p= (struct dnode **)xcalloc((size_t)num, (size_t)(sizeof(struct dnode *))); - return(p); + p = (struct dnode **) xcalloc((size_t) num, + (size_t) (sizeof(struct dnode *))); + return (p); } #ifdef CONFIG_FEATURE_LS_RECURSIVE @@ -342,16 +355,18 @@ static void dfree(struct dnode **dnp) { struct dnode *cur, *next; - if(dnp == NULL) return; + if (dnp == NULL) + return; - cur=dnp[0]; + cur = dnp[0]; while (cur != NULL) { - if (cur->fullname != NULL) free(cur->fullname); /* free the filename */ - next= cur->next; - free(cur); /* free the dnode */ - cur= next; + if (cur->fullname != NULL) + free(cur->fullname); /* free the filename */ + next = cur->next; + free(cur); /* free the dnode */ + cur = next; } - free(dnp); /* free the array holding the dnode pointers */ + free(dnp); /* free the array holding the dnode pointers */ } #endif @@ -360,37 +375,38 @@ static struct dnode **splitdnarray(struct dnode **dn, int nfiles, int which) int dncnt, i, d; struct dnode **dnp; - if (dn==NULL || nfiles < 1) return(NULL); + if (dn == NULL || nfiles < 1) + return (NULL); /* count how many dirs and regular files there are */ if (which == SPLIT_SUBDIR) dncnt = countsubdirs(dn, nfiles); else { - dncnt= countdirs(dn, nfiles); /* assume we are looking for dirs */ + dncnt = countdirs(dn, nfiles); /* assume we are looking for dirs */ if (which == SPLIT_FILE) - dncnt= nfiles - dncnt; /* looking for files */ + dncnt = nfiles - dncnt; /* looking for files */ } /* allocate a file array and a dir array */ - dnp= dnalloc(dncnt); + dnp = dnalloc(dncnt); /* copy the entrys into the file or dir array */ - for (d= i=0; i<nfiles; i++) { + for (d = i = 0; i < nfiles; i++) { if (which == SPLIT_DIR) { if (S_ISDIR(dn[i]->dstat.st_mode)) { - dnp[d++]= dn[i]; - } /* else skip the file */ + dnp[d++] = dn[i]; + } /* else skip the file */ } else if (which == SPLIT_SUBDIR) { if (is_subdir(dn[i])) { - dnp[d++]= dn[i]; - } /* else skip the file or dir */ + dnp[d++] = dn[i]; + } /* else skip the file or dir */ } else { if (!(S_ISDIR(dn[i]->dstat.st_mode))) { - dnp[d++]= dn[i]; - } /* else skip the dir */ + dnp[d++] = dn[i]; + } /* else skip the dir */ } } - return(dnp); + return (dnp); } /*----------------------------------------------------------------------*/ @@ -399,36 +415,40 @@ static int sortcmp(struct dnode *d1, struct dnode *d2) { int cmp, dif; - cmp= 0; + cmp = 0; if (sort_opts == SORT_SIZE) { - dif= (int)(d1->dstat.st_size - d2->dstat.st_size); + dif = (int) (d1->dstat.st_size - d2->dstat.st_size); } else if (sort_opts == SORT_ATIME) { - dif= (int)(d1->dstat.st_atime - d2->dstat.st_atime); + dif = (int) (d1->dstat.st_atime - d2->dstat.st_atime); } else if (sort_opts == SORT_CTIME) { - dif= (int)(d1->dstat.st_ctime - d2->dstat.st_ctime); + dif = (int) (d1->dstat.st_ctime - d2->dstat.st_ctime); } else if (sort_opts == SORT_MTIME) { - dif= (int)(d1->dstat.st_mtime - d2->dstat.st_mtime); + dif = (int) (d1->dstat.st_mtime - d2->dstat.st_mtime); } else if (sort_opts == SORT_DIR) { - dif= S_ISDIR(d1->dstat.st_mode) - S_ISDIR(d2->dstat.st_mode); - /* } else if (sort_opts == SORT_VERSION) { */ - /* } else if (sort_opts == SORT_EXT) { */ - } else { /* assume SORT_NAME */ - dif= 0; + dif = S_ISDIR(d1->dstat.st_mode) - S_ISDIR(d2->dstat.st_mode); + /* } else if (sort_opts == SORT_VERSION) { */ + /* } else if (sort_opts == SORT_EXT) { */ + } else { /* assume SORT_NAME */ + dif = 0; } - if (dif > 0) cmp= -1; - if (dif < 0) cmp= 1; + if (dif > 0) + cmp = -1; + if (dif < 0) + cmp = 1; if (dif == 0) { /* sort by name- may be a tie_breaker for time or size cmp */ - dif= strcmp(d1->name, d2->name); - if (dif > 0) cmp= 1; - if (dif < 0) cmp= -1; + dif = strcmp(d1->name, d2->name); + if (dif > 0) + cmp = 1; + if (dif < 0) + cmp = -1; } if (sort_order == SORT_REVERSE) { - cmp= -1 * cmp; + cmp = -1 * cmp; } - return(cmp); + return (cmp); } /*----------------------------------------------------------------------*/ @@ -438,17 +458,18 @@ static void shellsort(struct dnode **dn, int size) int gap, i, j; /* shell short the array */ - if(dn==NULL || size < 2) return; + if (dn == NULL || size < 2) + return; - for (gap= size/2; gap>0; gap /=2) { - for (i=gap; i<size; i++) { - for (j= i-gap; j>=0; j-=gap) { - if (sortcmp(dn[j], dn[j+gap]) <= 0) + for (gap = size / 2; gap > 0; gap /= 2) { + for (i = gap; i < size; i++) { + for (j = i - gap; j >= 0; j -= gap) { + if (sortcmp(dn[j], dn[j + gap]) <= 0) break; /* they are out of order, swap them */ - temp= dn[j]; - dn[j]= dn[j+gap]; - dn[j+gap]= temp; + temp = dn[j]; + dn[j] = dn[j + gap]; + dn[j + gap] = temp; } } } @@ -459,32 +480,33 @@ static void shellsort(struct dnode **dn, int size) static void showfiles(struct dnode **dn, int nfiles) { int i, ncols, nrows, row, nc; + #ifdef CONFIG_FEATURE_AUTOWIDTH int len; #endif - if(dn==NULL || nfiles < 1) return; + if (dn == NULL || nfiles < 1) + return; #ifdef CONFIG_FEATURE_AUTOWIDTH /* find the longest file name- use that as the column width */ - column_width= 0; - for (i=0; i<nfiles; i++) { - len= strlen(dn[i]->name) + + column_width = 0; + for (i = 0; i < nfiles; i++) { + len = strlen(dn[i]->name) + ((list_fmt & LIST_INO) ? 8 : 0) + - ((list_fmt & LIST_BLOCKS) ? 5 : 0) - ; - if (column_width < len) - column_width= len; + ((list_fmt & LIST_BLOCKS) ? 5 : 0); + if (column_width < len) + column_width = len; } - ncols = (int)(terminal_width / (column_width + COLUMN_GAP)); + ncols = (int) (terminal_width / (column_width + COLUMN_GAP)); #else - ncols= TERMINAL_WIDTH; + ncols = TERMINAL_WIDTH; #endif switch (style_fmt) { - case STYLE_LONG: /* one record per line, extended info */ - case STYLE_SINGLE: /* one record per line */ - ncols= 1; - break; + case STYLE_LONG: /* one record per line, extended info */ + case STYLE_SINGLE: /* one record per line */ + ncols = 1; + break; } if (ncols > 1) { @@ -493,15 +515,17 @@ static void showfiles(struct dnode **dn, int nfiles) nrows = nfiles; ncols = 1; } - if ((nrows * ncols) < nfiles) nrows++; /* round up fractionals */ + if ((nrows * ncols) < nfiles) + nrows++; /* round up fractionals */ - if (nrows > nfiles) nrows= nfiles; - for (row=0; row<nrows; row++) { - for (nc=0; nc<ncols; nc++) { + if (nrows > nfiles) + nrows = nfiles; + for (row = 0; row < nrows; row++) { + for (nc = 0; nc < ncols; nc++) { /* reach into the array based on the column and row */ - i= (nc * nrows) + row; /* assume display by column */ + i = (nc * nrows) + row; /* assume display by column */ if (disp_opts & DISP_ROWS) - i= (row * ncols) + nc; /* display across row */ + i = (row * ncols) + nc; /* display across row */ if (i < nfiles) { nexttabstop(); list_single(dn[i]); @@ -516,19 +540,21 @@ static void showdirs(struct dnode **dn, int ndirs) { int i, nfiles; struct dnode **subdnp; + #ifdef CONFIG_FEATURE_LS_RECURSIVE int dndirs; struct dnode **dnd; #endif - if (dn==NULL || ndirs < 1) return; + if (dn == NULL || ndirs < 1) + return; - for (i=0; i<ndirs; i++) { + for (i = 0; i < ndirs; i++) { if (disp_opts & (DISP_DIRNAME | DISP_RECURSIVE)) { printf("\n%s:\n", dn[i]->fullname); } - subdnp= list_dir(dn[i]->fullname); - nfiles= countfiles(subdnp); + subdnp = list_dir(dn[i]->fullname); + nfiles = countfiles(subdnp); if (nfiles > 0) { /* list all files at this level */ #ifdef CONFIG_FEATURE_LS_SORTFILES @@ -538,17 +564,17 @@ static void showdirs(struct dnode **dn, int ndirs) #ifdef CONFIG_FEATURE_LS_RECURSIVE if (disp_opts & DISP_RECURSIVE) { /* recursive- list the sub-dirs */ - dnd= splitdnarray(subdnp, nfiles, SPLIT_SUBDIR); - dndirs= countsubdirs(subdnp, nfiles); + dnd = splitdnarray(subdnp, nfiles, SPLIT_SUBDIR); + dndirs = countsubdirs(subdnp, nfiles); if (dndirs > 0) { #ifdef CONFIG_FEATURE_LS_SORTFILES shellsort(dnd, dndirs); #endif showdirs(dnd, dndirs); - free(dnd); /* free the array of dnode pointers to the dirs */ + free(dnd); /* free the array of dnode pointers to the dirs */ } } - dfree(subdnp); /* free the dnodes and the fullname mem */ + dfree(subdnp); /* free the dnodes and the fullname mem */ #endif } } @@ -562,53 +588,56 @@ static struct dnode **list_dir(char *path) DIR *dir; int i, nfiles; - if (path==NULL) return(NULL); + if (path == NULL) + return (NULL); - dn= NULL; - nfiles= 0; + dn = NULL; + nfiles = 0; dir = opendir(path); if (dir == NULL) { perror_msg("%s", path); status = EXIT_FAILURE; - return(NULL); /* could not open the dir */ + return (NULL); /* could not open the dir */ } while ((entry = readdir(dir)) != NULL) { /* are we going to list the file- it may be . or .. or a hidden file */ - if ((strcmp(entry->d_name, ".")==0) && !(disp_opts & DISP_DOT)) + if ((strcmp(entry->d_name, ".") == 0) && !(disp_opts & DISP_DOT)) continue; - if ((strcmp(entry->d_name, "..")==0) && !(disp_opts & DISP_DOT)) + if ((strcmp(entry->d_name, "..") == 0) && !(disp_opts & DISP_DOT)) continue; - if ((entry->d_name[0] == '.') && !(disp_opts & DISP_HIDDEN)) + if ((entry->d_name[0] == '.') && !(disp_opts & DISP_HIDDEN)) continue; - cur= (struct dnode *)xmalloc(sizeof(struct dnode)); + cur = (struct dnode *) xmalloc(sizeof(struct dnode)); cur->fullname = concat_path_file(path, entry->d_name); cur->name = cur->fullname + - (strlen(cur->fullname) - strlen(entry->d_name)); + (strlen(cur->fullname) - strlen(entry->d_name)); if (my_stat(cur)) continue; - cur->next= dn; - dn= cur; + cur->next = dn; + dn = cur; nfiles++; } closedir(dir); /* now that we know how many files there are - ** allocate memory for an array to hold dnode pointers - */ - if (nfiles < 1) return(NULL); - dnp= dnalloc(nfiles); - for (i=0, cur=dn; i<nfiles; i++) { - dnp[i]= cur; /* save pointer to node in array */ - cur= cur->next; + ** allocate memory for an array to hold dnode pointers + */ + if (nfiles < 1) + return (NULL); + dnp = dnalloc(nfiles); + for (i = 0, cur = dn; i < nfiles; i++) { + dnp[i] = cur; /* save pointer to node in array */ + cur = cur->next; } - return(dnp); + return (dnp); } /*----------------------------------------------------------------------*/ static int list_single(struct dnode *dn) { int i; + #ifdef CONFIG_FEATURE_LS_USERNAME char scratch[BUFSIZ + 1]; #endif @@ -616,158 +645,167 @@ static int list_single(struct dnode *dn) char *filetime; time_t ttime, age; #endif -#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR) +#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined (CONFIG_FEATURE_LS_COLOR) struct stat info; char append; #endif - if (dn==NULL || dn->fullname==NULL) return(0); + if (dn == NULL || dn->fullname == NULL) + return (0); #ifdef CONFIG_FEATURE_LS_TIMESTAMPS - ttime= dn->dstat.st_mtime; /* the default time */ - if (time_fmt & TIME_ACCESS) ttime= dn->dstat.st_atime; - if (time_fmt & TIME_CHANGE) ttime= dn->dstat.st_ctime; - filetime= ctime(&ttime); + ttime = dn->dstat.st_mtime; /* the default time */ + if (time_fmt & TIME_ACCESS) + ttime = dn->dstat.st_atime; + if (time_fmt & TIME_CHANGE) + ttime = dn->dstat.st_ctime; + filetime = ctime(&ttime); #endif #ifdef CONFIG_FEATURE_LS_FILETYPES append = append_char(dn->dstat.st_mode); #endif - for (i=0; i<=31; i++) { - switch (list_fmt & (1<<i)) { - case LIST_INO: - printf("%7ld ", (long int)dn->dstat.st_ino); - column += 8; - break; - case LIST_BLOCKS: + for (i = 0; i <= 31; i++) { + switch (list_fmt & (1 << i)) { + case LIST_INO: + printf("%7ld ", (long int) dn->dstat.st_ino); + column += 8; + break; + case LIST_BLOCKS: #ifdef CONFIG_FEATURE_HUMAN_READABLE - fprintf(stdout, "%6s ", make_human_readable_str(dn->dstat.st_blocks>>1, - KILOBYTE, (ls_disp_hr==TRUE)? 0: KILOBYTE)); + fprintf(stdout, "%6s ", + make_human_readable_str(dn->dstat.st_blocks >> 1, + KILOBYTE, + (ls_disp_hr == + TRUE) ? 0 : KILOBYTE)); #else #if _FILE_OFFSET_BITS == 64 - printf("%4lld ", dn->dstat.st_blocks>>1); + printf("%4lld ", dn->dstat.st_blocks >> 1); #else - printf("%4ld ", dn->dstat.st_blocks>>1); + printf("%4ld ", dn->dstat.st_blocks >> 1); #endif #endif - column += 5; - break; - case LIST_MODEBITS: - printf("%-10s ", (char *)mode_string(dn->dstat.st_mode)); - column += 10; - break; - case LIST_NLINKS: - printf("%4ld ", (long)dn->dstat.st_nlink); - column += 10; - break; - case LIST_ID_NAME: + column += 5; + break; + case LIST_MODEBITS: + printf("%-10s ", (char *) mode_string(dn->dstat.st_mode)); + column += 10; + break; + case LIST_NLINKS: + printf("%4ld ", (long) dn->dstat.st_nlink); + column += 10; + break; + case LIST_ID_NAME: #ifdef CONFIG_FEATURE_LS_USERNAME - my_getpwuid(scratch, dn->dstat.st_uid); - printf("%-8.8s ", scratch); - my_getgrgid(scratch, dn->dstat.st_gid); - printf("%-8.8s", scratch); - column += 17; - break; + my_getpwuid(scratch, dn->dstat.st_uid); + printf("%-8.8s ", scratch); + my_getgrgid(scratch, dn->dstat.st_gid); + printf("%-8.8s", scratch); + column += 17; + break; #endif - case LIST_ID_NUMERIC: - printf("%-8d %-8d", dn->dstat.st_uid, dn->dstat.st_gid); - column += 17; - break; - case LIST_SIZE: - case LIST_DEV: - if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) { - printf("%4d, %3d ", (int)MAJOR(dn->dstat.st_rdev), (int)MINOR(dn->dstat.st_rdev)); - } else { + case LIST_ID_NUMERIC: + printf("%-8d %-8d", dn->dstat.st_uid, dn->dstat.st_gid); + column += 17; + break; + case LIST_SIZE: + case LIST_DEV: + if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) { + printf("%4d, %3d ", (int) MAJOR(dn->dstat.st_rdev), + (int) MINOR(dn->dstat.st_rdev)); + } else { #ifdef CONFIG_FEATURE_HUMAN_READABLE - if (ls_disp_hr==TRUE) { - fprintf(stdout, "%8s ", make_human_readable_str(dn->dstat.st_size, 1, 0)); - } else -#endif - { + if (ls_disp_hr == TRUE) { + fprintf(stdout, "%8s ", + make_human_readable_str(dn->dstat.st_size, 1, 0)); + } else +#endif + { #if _FILE_OFFSET_BITS == 64 - printf("%9lld ", (long long)dn->dstat.st_size); + printf("%9lld ", (long long) dn->dstat.st_size); #else - printf("%9ld ", dn->dstat.st_size); + printf("%9ld ", dn->dstat.st_size); #endif - } } - column += 10; - break; + } + column += 10; + break; #ifdef CONFIG_FEATURE_LS_TIMESTAMPS - case LIST_FULLTIME: - case LIST_DATE_TIME: - if (list_fmt & LIST_FULLTIME) { - printf("%24.24s ", filetime); - column += 25; - break; - } - age = time(NULL) - ttime; - printf("%6.6s ", filetime+4); - if (age < 3600L * 24 * 365 / 2 && age > -15 * 60) { - /* hh:mm if less than 6 months old */ - printf("%5.5s ", filetime+11); - } else { - printf(" %4.4s ", filetime+20); - } - column += 13; + case LIST_FULLTIME: + case LIST_DATE_TIME: + if (list_fmt & LIST_FULLTIME) { + printf("%24.24s ", filetime); + column += 25; break; + } + age = time(NULL) - ttime; + printf("%6.6s ", filetime + 4); + if (age < 3600L * 24 * 365 / 2 && age > -15 * 60) { + /* hh:mm if less than 6 months old */ + printf("%5.5s ", filetime + 11); + } else { + printf(" %4.4s ", filetime + 20); + } + column += 13; + break; #endif - case LIST_FILENAME: + case LIST_FILENAME: #ifdef CONFIG_FEATURE_LS_COLOR - errno = 0; - if (show_color && !lstat(dn->fullname, &info)) { - printf( "\033[%d;%dm", bgcolor(info.st_mode), - fgcolor(info.st_mode) ); - } + errno = 0; + if (show_color && !lstat(dn->fullname, &info)) { + printf("\033[%d;%dm", bgcolor(info.st_mode), + fgcolor(info.st_mode)); + } #endif - printf("%s", dn->name); + printf("%s", dn->name); #ifdef CONFIG_FEATURE_LS_COLOR - if (show_color) { - printf( "\033[0m" ); - } + if (show_color) { + printf("\033[0m"); + } #endif - column += strlen(dn->name); - break; - case LIST_SYMLINK: - if (S_ISLNK(dn->dstat.st_mode)) { - char *lpath = xreadlink(dn->fullname); - if (lpath) { - printf(" -> "); -#if defined(BB_FEATURE_LS_FILETYPES) || defined(CONFIG_FEATURE_LS_COLOR) - if (!stat(dn->fullname, &info)) { - append = append_char(info.st_mode); - } + column += strlen(dn->name); + break; + case LIST_SYMLINK: + if (S_ISLNK(dn->dstat.st_mode)) { + char *lpath = xreadlink(dn->fullname); + + if (lpath) { + printf(" -> "); +#if defined(CONFIG_FEATURE_LS_FILETYPES) || defined (CONFIG_FEATURE_LS_COLOR) + if (!stat(dn->fullname, &info)) { + append = append_char(info.st_mode); + } #endif #ifdef CONFIG_FEATURE_LS_COLOR - if (show_color) { - errno = 0; - printf( "\033[%d;%dm", bgcolor(info.st_mode), - fgcolor(info.st_mode) ); - } + if (show_color) { + errno = 0; + printf("\033[%d;%dm", bgcolor(info.st_mode), + fgcolor(info.st_mode)); + } #endif - printf("%s", lpath); + printf("%s", lpath); #ifdef CONFIG_FEATURE_LS_COLOR - if (show_color) { - printf( "\033[0m" ); - } -#endif - column += strlen(lpath) + 4; - free(lpath); + if (show_color) { + printf("\033[0m"); } +#endif + column += strlen(lpath) + 4; + free(lpath); } - break; + } + break; #ifdef CONFIG_FEATURE_LS_FILETYPES - case LIST_FILETYPE: - if (append != '\0') { - printf("%1c", append); - column++; - } - break; + case LIST_FILETYPE: + if (append != '\0') { + printf("%1c", append); + column++; + } + break; #endif } } - return(0); + return (0); } /*----------------------------------------------------------------------*/ @@ -780,19 +818,20 @@ extern int ls_main(int argc, char **argv) int opt; int oi, ac; char **av; + #ifdef CONFIG_FEATURE_AUTOWIDTH struct winsize win = { 0, 0, 0, 0 }; #endif - disp_opts= DISP_NORMAL; - style_fmt= STYLE_AUTO; - list_fmt= LIST_SHORT; + disp_opts = DISP_NORMAL; + style_fmt = STYLE_AUTO; + list_fmt = LIST_SHORT; #ifdef CONFIG_FEATURE_LS_SORTFILES - sort_opts= SORT_NAME; - sort_order= SORT_FORWARD; + sort_opts = SORT_NAME; + sort_order = SORT_FORWARD; #endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS - time_fmt= TIME_MOD; + time_fmt = TIME_MOD; #endif #ifdef CONFIG_FEATURE_AUTOWIDTH ioctl(fileno(stdout), TIOCGWINSZ, &win); @@ -801,7 +840,7 @@ extern int ls_main(int argc, char **argv) if (win.ws_col > 0) terminal_width = win.ws_col - 1; #endif - nfiles=0; + nfiles = 0; #ifdef CONFIG_FEATURE_LS_COLOR if (isatty(fileno(stdout))) @@ -811,108 +850,154 @@ extern int ls_main(int argc, char **argv) /* process options */ while ((opt = getopt(argc, argv, "1AaCdgilnsx" #ifdef CONFIG_FEATURE_AUTOWIDTH -"T:w:" + "T:w:" #endif #ifdef CONFIG_FEATURE_LS_FILETYPES -"Fp" + "Fp" #endif #ifdef CONFIG_FEATURE_LS_RECURSIVE -"R" + "R" #endif #ifdef CONFIG_FEATURE_LS_SORTFILES -"rSvX" + "rSvX" #endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS -"cetu" + "cetu" #endif #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS -"L" + "L" #endif #ifdef CONFIG_FEATURE_HUMAN_READABLE -"h" + "h" #endif -"k")) > 0) { + "k")) > 0) { switch (opt) { - case '1': style_fmt = STYLE_SINGLE; break; - case 'A': disp_opts |= DISP_HIDDEN; break; - case 'a': disp_opts |= DISP_HIDDEN | DISP_DOT; break; - case 'C': style_fmt = STYLE_COLUMNS; break; - case 'd': disp_opts |= DISP_NOLIST; break; - case 'g': /* ignore -- for ftp servers */ break; - case 'i': list_fmt |= LIST_INO; break; - case 'l': - style_fmt = STYLE_LONG; - list_fmt |= LIST_LONG; + case '1': + style_fmt = STYLE_SINGLE; + break; + case 'A': + disp_opts |= DISP_HIDDEN; + break; + case 'a': + disp_opts |= DISP_HIDDEN | DISP_DOT; + break; + case 'C': + style_fmt = STYLE_COLUMNS; + break; + case 'd': + disp_opts |= DISP_NOLIST; + break; + case 'g': /* ignore -- for ftp servers */ + break; + case 'i': + list_fmt |= LIST_INO; + break; + case 'l': + style_fmt = STYLE_LONG; + list_fmt |= LIST_LONG; #ifdef CONFIG_FEATURE_HUMAN_READABLE - ls_disp_hr = FALSE; + ls_disp_hr = FALSE; #endif break; - case 'n': list_fmt |= LIST_ID_NUMERIC; break; - case 's': list_fmt |= LIST_BLOCKS; break; - case 'x': disp_opts = DISP_ROWS; break; + case 'n': + list_fmt |= LIST_ID_NUMERIC; + break; + case 's': + list_fmt |= LIST_BLOCKS; + break; + case 'x': + disp_opts = DISP_ROWS; + break; #ifdef CONFIG_FEATURE_LS_FILETYPES - case 'F': list_fmt |= LIST_FILETYPE | LIST_EXEC; break; - case 'p': list_fmt |= LIST_FILETYPE; break; + case 'F': + list_fmt |= LIST_FILETYPE | LIST_EXEC; + break; + case 'p': + list_fmt |= LIST_FILETYPE; + break; #endif #ifdef CONFIG_FEATURE_LS_RECURSIVE - case 'R': disp_opts |= DISP_RECURSIVE; break; + case 'R': + disp_opts |= DISP_RECURSIVE; + break; #endif #ifdef CONFIG_FEATURE_LS_SORTFILES - case 'r': sort_order |= SORT_REVERSE; break; - case 'S': sort_opts= SORT_SIZE; break; - case 'v': sort_opts= SORT_VERSION; break; - case 'X': sort_opts= SORT_EXT; break; + case 'r': + sort_order |= SORT_REVERSE; + break; + case 'S': + sort_opts = SORT_SIZE; + break; + case 'v': + sort_opts = SORT_VERSION; + break; + case 'X': + sort_opts = SORT_EXT; + break; #endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS - case 'e': list_fmt |= LIST_FULLTIME; break; - case 'c': - time_fmt = TIME_CHANGE; + case 'e': + list_fmt |= LIST_FULLTIME; + break; + case 'c': + time_fmt = TIME_CHANGE; #ifdef CONFIG_FEATURE_LS_SORTFILES - sort_opts= SORT_CTIME; + sort_opts = SORT_CTIME; #endif - break; - case 'u': - time_fmt = TIME_ACCESS; + break; + case 'u': + time_fmt = TIME_ACCESS; #ifdef CONFIG_FEATURE_LS_SORTFILES - sort_opts= SORT_ATIME; + sort_opts = SORT_ATIME; #endif - break; - case 't': + break; + case 't': #ifdef CONFIG_FEATURE_LS_SORTFILES - sort_opts= SORT_MTIME; + sort_opts = SORT_MTIME; #endif - break; + break; #endif #ifdef CONFIG_FEATURE_LS_FOLLOWLINKS - case 'L': follow_links= TRUE; break; + case 'L': + follow_links = TRUE; + break; #endif #ifdef CONFIG_FEATURE_AUTOWIDTH - case 'T': tabstops= atoi(optarg); break; - case 'w': terminal_width= atoi(optarg); break; + case 'T': + tabstops = atoi(optarg); + break; + case 'w': + terminal_width = atoi(optarg); + break; #endif #ifdef CONFIG_FEATURE_HUMAN_READABLE - case 'h': ls_disp_hr = TRUE; break; + case 'h': + ls_disp_hr = TRUE; + break; #endif - case 'k': break; - default: - goto print_usage_message; + case 'k': + break; + default: + goto print_usage_message; } } /* sort out which command line options take precedence */ #ifdef CONFIG_FEATURE_LS_RECURSIVE if (disp_opts & DISP_NOLIST) - disp_opts &= ~DISP_RECURSIVE; /* no recurse if listing only dir */ + disp_opts &= ~DISP_RECURSIVE; /* no recurse if listing only dir */ #endif #if defined (CONFIG_FEATURE_LS_TIMESTAMPS) && defined (CONFIG_FEATURE_LS_SORTFILES) - if (time_fmt & TIME_CHANGE) sort_opts= SORT_CTIME; - if (time_fmt & TIME_ACCESS) sort_opts= SORT_ATIME; + if (time_fmt & TIME_CHANGE) + sort_opts = SORT_CTIME; + if (time_fmt & TIME_ACCESS) + sort_opts = SORT_ATIME; #endif if (style_fmt != STYLE_LONG) - list_fmt &= ~LIST_ID_NUMERIC; /* numeric uid only for long list */ + list_fmt &= ~LIST_ID_NUMERIC; /* numeric uid only for long list */ #ifdef CONFIG_FEATURE_LS_USERNAME if (style_fmt == STYLE_LONG && (list_fmt & LIST_ID_NUMERIC)) - list_fmt &= ~LIST_ID_NAME; /* don't list names if numeric uid */ + list_fmt &= ~LIST_ID_NAME; /* don't list names if numeric uid */ #endif /* choose a display format */ @@ -926,42 +1011,42 @@ extern int ls_main(int argc, char **argv) * just holds the pointers- we don't move the date the pointers * point to. */ - ac= argc - optind; /* how many cmd line args are left */ + ac = argc - optind; /* how many cmd line args are left */ if (ac < 1) { - av= (char **)xcalloc((size_t)1, (size_t)(sizeof(char *))); - av[0]= xstrdup("."); - ac=1; + av = (char **) xcalloc((size_t) 1, (size_t) (sizeof(char *))); + av[0] = xstrdup("."); + ac = 1; } else { - av= (char **)xcalloc((size_t)ac, (size_t)(sizeof(char *))); - for (oi=0 ; oi < ac; oi++) { - av[oi]= argv[optind++]; /* copy pointer to real cmd line arg */ + av = (char **) xcalloc((size_t) ac, (size_t) (sizeof(char *))); + for (oi = 0; oi < ac; oi++) { + av[oi] = argv[optind++]; /* copy pointer to real cmd line arg */ } } /* now, everything is in the av array */ if (ac > 1) - disp_opts |= DISP_DIRNAME; /* 2 or more items? label directories */ + disp_opts |= DISP_DIRNAME; /* 2 or more items? label directories */ /* stuff the command line file names into an dnode array */ - dn=NULL; - for (oi=0 ; oi < ac; oi++) { - cur= (struct dnode *)xmalloc(sizeof(struct dnode)); - cur->fullname= xstrdup(av[oi]); - cur->name= cur->fullname; + dn = NULL; + for (oi = 0; oi < ac; oi++) { + cur = (struct dnode *) xmalloc(sizeof(struct dnode)); + cur->fullname = xstrdup(av[oi]); + cur->name = cur->fullname; if (my_stat(cur)) continue; - cur->next= dn; - dn= cur; + cur->next = dn; + dn = cur; nfiles++; } /* now that we know how many files there are - ** allocate memory for an array to hold dnode pointers - */ - dnp= dnalloc(nfiles); - for (i=0, cur=dn; i<nfiles; i++) { - dnp[i]= cur; /* save pointer to node in array */ - cur= cur->next; + ** allocate memory for an array to hold dnode pointers + */ + dnp = dnalloc(nfiles); + for (i = 0, cur = dn; i < nfiles; i++) { + dnp[i] = cur; /* save pointer to node in array */ + cur = cur->next; } @@ -969,12 +1054,13 @@ extern int ls_main(int argc, char **argv) #ifdef CONFIG_FEATURE_LS_SORTFILES shellsort(dnp, nfiles); #endif - if (nfiles > 0) showfiles(dnp, nfiles); + if (nfiles > 0) + showfiles(dnp, nfiles); } else { - dnd= splitdnarray(dnp, nfiles, SPLIT_DIR); - dnf= splitdnarray(dnp, nfiles, SPLIT_FILE); - dndirs= countdirs(dnp, nfiles); - dnfiles= nfiles - dndirs; + dnd = splitdnarray(dnp, nfiles, SPLIT_DIR); + dnf = splitdnarray(dnp, nfiles, SPLIT_FILE); + dndirs = countdirs(dnp, nfiles); + dnfiles = nfiles - dndirs; if (dnfiles > 0) { #ifdef CONFIG_FEATURE_LS_SORTFILES shellsort(dnf, dnfiles); @@ -988,7 +1074,7 @@ extern int ls_main(int argc, char **argv) showdirs(dnd, dndirs); } } - return(status); + return (status); print_usage_message: show_usage(); |