implement -1CFx flags
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@9335 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		| @@ -34,6 +34,19 @@ | ||||
|  | ||||
| RCSID("$Id$"); | ||||
|  | ||||
| #ifdef TEST | ||||
| #define sec_fprintf2 fprintf | ||||
| #define sec_fflush fflush | ||||
| int | ||||
| main(int argc, char **argv) | ||||
| { | ||||
|     int i; | ||||
|     for(i = 1; i < argc; i++) | ||||
| 	builtin_ls(stdout, argv[i]); | ||||
|     return 0; | ||||
| } | ||||
| #endif | ||||
|  | ||||
| struct fileinfo { | ||||
|     struct stat st; | ||||
|     int inode; | ||||
| @@ -63,17 +76,23 @@ free_fileinfo(struct fileinfo *f) | ||||
|     free(f->link); | ||||
| } | ||||
|  | ||||
| #define LS_DIRS		 1 | ||||
| #define LS_IGNORE_DOT	 2 | ||||
| #define LS_SORT_MODE	 12 | ||||
| #define LS_DIRS		(1 << 0) | ||||
| #define LS_IGNORE_DOT	(1 << 1) | ||||
| #define LS_SORT_MODE	(3 << 2) | ||||
| #define SORT_MODE(f) ((f) & LS_SORT_MODE) | ||||
| #define LS_SORT_NAME	 4 | ||||
| #define LS_SORT_MTIME	 8 | ||||
| #define LS_SORT_SIZE	12 | ||||
| #define LS_SORT_REVERSE	16 | ||||
| #define LS_SORT_NAME	(1 << 2) | ||||
| #define LS_SORT_MTIME	(2 << 2) | ||||
| #define LS_SORT_SIZE	(3 << 2) | ||||
| #define LS_SORT_REVERSE	(1 << 4) | ||||
|  | ||||
| #define LS_SIZE		32 | ||||
| #define LS_INODE	64 | ||||
| #define LS_SIZE		(1 << 5) | ||||
| #define LS_INODE	(1 << 6) | ||||
| #define LS_TYPE		(1 << 7) | ||||
| #define LS_DISP_MODE	(3 << 8) | ||||
| #define DISP_MODE(f) ((f) & LS_DISP_MODE) | ||||
| #define LS_DISP_LONG	(1 << 8) | ||||
| #define LS_DISP_COLUMN	(2 << 8) | ||||
| #define LS_DISP_CROSS	(3 << 8) | ||||
|  | ||||
| #ifndef S_ISTXT | ||||
| #define S_ISTXT S_ISVTX | ||||
| @@ -91,6 +110,7 @@ static void | ||||
| make_fileinfo(const char *filename, struct fileinfo *file, int flags) | ||||
| { | ||||
|     char buf[128]; | ||||
|     int file_type = 0; | ||||
|     struct stat *st = &file->st; | ||||
|  | ||||
|     file->inode = st->st_ino; | ||||
| @@ -100,23 +120,36 @@ make_fileinfo(const char *filename, struct fileinfo *file, int flags) | ||||
|     file->bsize = st->st_blocks * 512 / 1024; | ||||
| #endif | ||||
|  | ||||
|     if(S_ISDIR(st->st_mode)) | ||||
|     if(S_ISDIR(st->st_mode)) { | ||||
| 	file->mode[0] = 'd'; | ||||
| 	file_type = '/'; | ||||
|     } | ||||
|     else if(S_ISCHR(st->st_mode)) | ||||
| 	file->mode[0] = 'c'; | ||||
|     else if(S_ISBLK(st->st_mode)) | ||||
| 	file->mode[0] = 'b'; | ||||
|     else if(S_ISREG(st->st_mode)) | ||||
|     else if(S_ISREG(st->st_mode)) { | ||||
| 	file->mode[0] = '-'; | ||||
|     else if(S_ISFIFO(st->st_mode)) | ||||
| 	if(st->st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) | ||||
| 	    file_type = '*'; | ||||
|     } | ||||
|     else if(S_ISFIFO(st->st_mode)) { | ||||
| 	file->mode[0] = 'p'; | ||||
|     else if(S_ISLNK(st->st_mode)) | ||||
| 	file_type = '|'; | ||||
|     } | ||||
|     else if(S_ISLNK(st->st_mode)) { | ||||
| 	file->mode[0] = 'l'; | ||||
|     else if(S_ISSOCK(st->st_mode)) | ||||
| 	file_type = '@'; | ||||
|     } | ||||
|     else if(S_ISSOCK(st->st_mode)) { | ||||
| 	file->mode[0] = 's'; | ||||
| 	file_type = '='; | ||||
|     } | ||||
| #ifdef S_ISWHT | ||||
|     else if(S_ISWHT(st->st_mode)) | ||||
|     else if(S_ISWHT(st->st_mode)) { | ||||
| 	file->mode[0] = 'w'; | ||||
| 	file_type = '%'; | ||||
|     } | ||||
| #endif | ||||
|     else  | ||||
| 	file->mode[0] = '?'; | ||||
| @@ -192,7 +225,10 @@ make_fileinfo(const char *filename, struct fileinfo *file, int flags) | ||||
| 	    p++; | ||||
| 	else | ||||
| 	    p = filename; | ||||
| 	file->filename = strdup(p); | ||||
| 	if((flags & LS_TYPE) && file_type != 0) | ||||
| 	    asprintf(&file->filename, "%s%c", p, file_type); | ||||
| 	else | ||||
| 	    file->filename = strdup(p); | ||||
|     } | ||||
|     if(S_ISLNK(st->st_mode)) { | ||||
| 	int n; | ||||
| @@ -414,7 +450,7 @@ list_files(FILE *out, const char **files, int n_files, int flags) | ||||
| 	      (int (*)(const void*, const void*))compare_size); | ||||
| 	break; | ||||
|     } | ||||
|     { | ||||
|     if(DISP_MODE(flags) == LS_DISP_LONG) { | ||||
| 	int max_inode = 0; | ||||
| 	int max_bsize = 0; | ||||
| 	int max_n_link = 0; | ||||
| @@ -482,10 +518,58 @@ list_files(FILE *out, const char **files, int n_files, int flags) | ||||
| 			   max_major, | ||||
| 			   max_minor, | ||||
| 			   max_date); | ||||
| 	for(i = 0; i < n_files; i++) | ||||
| 	    free_fileinfo(&fi[i]); | ||||
| 	free(fi); | ||||
|     } else if(DISP_MODE(flags) == LS_DISP_COLUMN ||  | ||||
| 	      DISP_MODE(flags) == LS_DISP_CROSS) { | ||||
| 	int max_len = 0; | ||||
| 	int num_files = n_files; | ||||
| 	int columns; | ||||
| 	int j; | ||||
| 	for(i = 0; i < n_files; i++) { | ||||
| 	    if(fi[i].filename == NULL) { | ||||
| 		num_files--; | ||||
| 		continue; | ||||
| 	    } | ||||
| 	    if(strlen(fi[i].filename) > max_len) | ||||
| 		max_len = strlen(fi[i].filename); | ||||
| 	} | ||||
| 	columns = 80 / (max_len + 1); /* get space between columns */ | ||||
| 	max_len = 80 / columns; | ||||
| 	if(DISP_MODE(flags) == LS_DISP_CROSS) { | ||||
| 	    for(i = 0, j = 0; i < n_files; i++) { | ||||
| 		if(fi[i].filename == NULL) | ||||
| 		    continue; | ||||
| 		sec_fprintf2(out, "%-*s", max_len, fi[i].filename); | ||||
| 		j++; | ||||
| 		if(j == columns) { | ||||
| 		    sec_fprintf2(out, "\r\n"); | ||||
| 		    j = 0; | ||||
| 		} | ||||
| 	    } | ||||
| 	    if(j > 0) | ||||
| 		    sec_fprintf2(out, "\r\n"); | ||||
| 	} else { | ||||
| 	    int skip = (num_files + columns - 1) / columns; | ||||
| 	    j = 0; | ||||
| 	    for(i = 0; i < skip; i++) { | ||||
| 		for(j = i; j < n_files;) { | ||||
| 		    while(j < n_files && fi[j].filename == NULL) | ||||
| 			j++; | ||||
| 		    sec_fprintf2(out, "%-*s", max_len, fi[j].filename); | ||||
| 		    j += skip; | ||||
| 		} | ||||
| 		sec_fprintf2(out, "\r\n"); | ||||
| 	    } | ||||
| 	} | ||||
|     } else { | ||||
| 	for(i = 0; i < n_files; i++) { | ||||
| 	    if(fi[i].filename == NULL) | ||||
| 		continue; | ||||
| 	    sec_fprintf2(out, "%s\r\n", fi[i].filename); | ||||
| 	} | ||||
|     } | ||||
|     for(i = 0; i < n_files; i++) | ||||
| 	free_fileinfo(&fi[i]); | ||||
|     free(fi); | ||||
| } | ||||
|  | ||||
| static void | ||||
| @@ -545,17 +629,21 @@ list_dir(FILE *out, const char *directory, int flags) | ||||
| void | ||||
| builtin_ls(FILE *out, const char *file) | ||||
| { | ||||
|     int flags = LS_SORT_NAME; | ||||
|     int flags = LS_SORT_NAME | LS_IGNORE_DOT | LS_DISP_LONG; | ||||
|  | ||||
|     if(*file == '-') { | ||||
| 	const char *p; | ||||
| 	for(p = file + 1; *p; p++) { | ||||
| 	    switch(*p) { | ||||
| 	    case '1': | ||||
| 		flags = (flags & ~LS_DISP_MODE); | ||||
| 		break; | ||||
| 	    case 'a': | ||||
| 	    case 'A': | ||||
| 		flags &= ~LS_IGNORE_DOT; | ||||
| 		break; | ||||
| 	    case 'C': | ||||
| 		flags = (flags & ~LS_DISP_MODE) | LS_DISP_COLUMN; | ||||
| 		break; | ||||
| 	    case 'd': | ||||
| 		flags |= LS_DIRS; | ||||
| @@ -563,10 +651,14 @@ builtin_ls(FILE *out, const char *file) | ||||
| 	    case 'f': | ||||
| 		flags = (flags & ~LS_SORT_MODE); | ||||
| 		break; | ||||
| 	    case 'F': | ||||
| 		flags |= LS_TYPE; | ||||
| 		break; | ||||
| 	    case 'i': | ||||
| 		flags |= flags | LS_INODE; | ||||
| 		flags |= LS_INODE; | ||||
| 		break; | ||||
| 	    case 'l': | ||||
| 		flags = (flags & ~LS_DISP_MODE) | LS_DISP_LONG; | ||||
| 		break; | ||||
| 	    case 't': | ||||
| 		flags = (flags & ~LS_SORT_MODE) | LS_SORT_MTIME; | ||||
| @@ -580,6 +672,9 @@ builtin_ls(FILE *out, const char *file) | ||||
| 	    case 'r': | ||||
| 		flags |= LS_SORT_REVERSE; | ||||
| 		break; | ||||
| 	    case 'x': | ||||
| 		flags = (flags & ~LS_DISP_MODE) | LS_DISP_CROSS; | ||||
| 		break; | ||||
| 	    } | ||||
| 	} | ||||
| 	file = "."; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Johan Danielsson
					Johan Danielsson