int qpkg_make(depend_atom *atom) { FILE *fp, *out; char tmpdir[BUFSIZE], filelist[BUFSIZE], xpak[BUFSIZE], tbz2[BUFSIZE]; size_t buflen; char *buf; int i; char *xpak_argv[2]; struct stat st; if (pretend) { printf(" %s-%s %s/%s:\n", GREEN, NORM, atom->CATEGORY, atom_to_pvr(atom)); return 0; } buflen = _Q_PATH_MAX; buf = xmalloc(buflen); snprintf(buf, buflen, "%s/%s/%s/CONTENTS", portvdb, atom->CATEGORY, atom_to_pvr(atom)); if ((fp = fopen(buf, "r")) == NULL) return -1; snprintf(tmpdir, sizeof(tmpdir), "%s/qpkg.XXXXXX", qpkg_get_bindir()); if ((i = mkstemp(tmpdir)) == -1) return -2; close(i); unlink(tmpdir); if (mkdir(tmpdir, 0750)) return -3; snprintf(filelist, sizeof(filelist), "%s/filelist", tmpdir); if ((out = fopen(filelist, "w")) == NULL) return -4; while (getline(&buf, &buflen, fp) != -1) { contents_entry *e; e = contents_parse_line(buf); if (!e || e->type == CONTENTS_DIR) continue; if (check_pkg_install_mask(e->name) != 0) continue; fprintf(out, "%s\n", e->name+1); /* dont output leading / */ if (e->type == CONTENTS_OBJ && verbose) { char *hash = (char *)hash_file(e->name, HASH_MD5); if (hash != NULL) { if (strcmp(e->digest, hash) != 0) warn("MD5: mismatch expected %s got %s for %s", e->digest, hash, e->name); free(hash); } } } fclose(out); fclose(fp); printf(" %s-%s %s/%s: ", GREEN, NORM, atom->CATEGORY, atom_to_pvr(atom)); fflush(stdout); snprintf(tbz2, sizeof(tbz2), "%s/bin.tar.bz2", tmpdir); snprintf(buf, buflen, "tar jcf '%s' --files-from='%s' --no-recursion >/dev/null 2>&1", tbz2, filelist); if ((fp = popen(buf, "r")) == NULL) return 2; pclose(fp); snprintf(xpak, sizeof(xpak), "%s/inf.xpak", tmpdir); snprintf(buf, buflen, "%s/%s/%s", portvdb, atom->CATEGORY, atom_to_pvr(atom)); xpak_argv[0] = buf; xpak_argv[1] = NULL; xpak_create(AT_FDCWD, xpak, 1, xpak_argv); snprintf(buf, buflen, "%s/binpkg.tbz2", tmpdir); tbz2_compose(AT_FDCWD, tbz2, xpak, buf); unlink(filelist); unlink(xpak); unlink(tbz2); snprintf(tbz2, sizeof(tbz2), "%s/%s.tbz2", qpkg_get_bindir(), atom_to_pvr(atom)); if (rename(buf, tbz2)) { warnp("could not move '%s' to '%s'", buf, tbz2); return 1; } rmdir(tmpdir); stat(tbz2, &st); printf("%s%s%s kB\n", RED, make_human_readable_str(st.st_size, 1, KILOBYTE), NORM); return 0; }
/*----------------------------------------------------------------------*/ static int list_single(struct dnode *dn) { int i, column = 0; #ifdef CONFIG_FEATURE_LS_USERNAME char scratch[16]; #endif #ifdef CONFIG_FEATURE_LS_TIMESTAMPS char *filetime; time_t ttime, age; #endif #if defined(CONFIG_FEATURE_LS_FILETYPES) || defined (CONFIG_FEATURE_LS_COLOR) struct stat info; char append; #endif if (dn->fullname == NULL) return (0); #ifdef CONFIG_FEATURE_LS_TIMESTAMPS ttime = dn->dstat.st_mtime; /* the default time */ if (all_fmt & TIME_ACCESS) ttime = dn->dstat.st_atime; if (all_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 (all_fmt & (1 << i)) { case LIST_INO: column += printf("%7ld ", (long int) dn->dstat.st_ino); break; case LIST_BLOCKS: #if _FILE_OFFSET_BITS == 64 column += printf("%4lld ", dn->dstat.st_blocks >> 1); #else column += printf("%4ld ", dn->dstat.st_blocks >> 1); #endif break; case LIST_MODEBITS: column += printf("%-10s ", (char *) bb_mode_string(dn->dstat.st_mode)); break; case LIST_NLINKS: column += printf("%4ld ", (long) dn->dstat.st_nlink); 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; #endif case LIST_ID_NUMERIC: column += printf("%-8d %-8d", dn->dstat.st_uid, dn->dstat.st_gid); break; case LIST_SIZE: case LIST_DEV: if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) { column += printf("%4d, %3d ", (int) MAJOR(dn->dstat.st_rdev), (int) MINOR(dn->dstat.st_rdev)); } else { #ifdef CONFIG_FEATURE_HUMAN_READABLE if (all_fmt & LS_DISP_HR) { column += printf("%9s ", make_human_readable_str(dn->dstat.st_size, 1, 0)); } else #endif { #if _FILE_OFFSET_BITS == 64 column += printf("%9lld ", (long long) dn->dstat.st_size); #else column += printf("%9ld ", dn->dstat.st_size); #endif } } break; #ifdef CONFIG_FEATURE_LS_TIMESTAMPS case LIST_FULLTIME: printf("%24.24s ", filetime); column += 25; break; case LIST_DATE_TIME: if ((all_fmt & LIST_FULLTIME) == 0) { 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 #ifdef CONFIG_SELINUX case LIST_CONTEXT: { char context[64]; int len = sizeof(context); if(security_sid_to_context(dn->sid, context, &len)) { strcpy(context, "unknown"); len = 7; } printf("%-32s ", context); column += MAX(33, len); } break; #endif 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)); } #endif column += printf("%s", dn->name); #ifdef CONFIG_FEATURE_LS_COLOR if (show_color) { printf("\033[0m"); } #endif 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)); } #endif column += printf("%s", lpath) + 4; #ifdef CONFIG_FEATURE_LS_COLOR if (show_color) { printf("\033[0m"); } #endif free(lpath); } } break; #ifdef CONFIG_FEATURE_LS_FILETYPES case LIST_FILETYPE: if (append != '\0') { printf("%1c", append); column++; } break; #endif } } return column; }
/* figure out what dirs we want to process for cleaning and display results. */ int qpkg_clean(char *dirp) { FILE *fp; int i, count; size_t disp_units = 0; uint64_t num_all_bytes; struct dirent **dnames; queue *vdb; vdb = get_vdb_atoms(1); if (chdir(dirp) != 0) { free_sets(vdb); return 1; } if ((count = scandir(".", &dnames, filter_hidden, alphasort)) < 0) { free_sets(vdb); return 1; } if (eclean) { if ((fp = fopen(initialize_ebuild_flat(), "r")) != NULL) { size_t buflen; char *buf; buf = NULL; while (getline(&buf, &buflen, fp) != -1) { char *name, *p; if ((p = strrchr(buf, '.')) == NULL) continue; *p = 0; if ((p = strrchr(buf, '/')) == NULL) continue; *p = 0; name = p + 1; if ((p = strrchr(buf, '/')) == NULL) continue; *p = 0; /* these strcat() are safe. the name is extracted from buf already. */ strcat(buf, "/"); strcat(buf, name); /* num_all_bytes will be off when pretend and eclean are enabled together */ /* vdb = del_set(buf, vdb, &i); */ vdb = add_set(buf, vdb); } free(buf); fclose(fp); } } num_all_bytes = qpkg_clean_dir(dirp, vdb); for (i = 0; i < count; i++) { char buf[_Q_PATH_MAX]; snprintf(buf, sizeof(buf), "%s/%s", dirp, dnames[i]->d_name); num_all_bytes += qpkg_clean_dir(buf, vdb); } scandir_free(dnames, count); free_sets(vdb); disp_units = KILOBYTE; if ((num_all_bytes / KILOBYTE) > 1000) disp_units = MEGABYTE; qprintf(" %s*%s Total space that would be freed in packages directory: %s%s %c%s\n", GREEN, NORM, RED, make_human_readable_str(num_all_bytes, 1, disp_units), disp_units == MEGABYTE ? 'M' : 'K', NORM); return 0; }
int df_main(int argc, char **argv) { long blocks_used; long blocks_percent_used; #ifdef CONFIG_FEATURE_HUMAN_READABLE unsigned long df_disp_hr = KILOBYTE; #endif int status = EXIT_SUCCESS; unsigned long opt; FILE *mount_table; struct mntent *mount_entry; struct statfs s; static const char hdr_1k[] = "1k-blocks"; /* default display is kilobytes */ const char *disp_units_hdr = hdr_1k; #ifdef CONFIG_FEATURE_HUMAN_READABLE bb_opt_complementally = "h-km:k-hm:m-hk"; opt = bb_getopt_ulflags(argc, argv, "hmk"); if(opt & 1) { df_disp_hr = 0; disp_units_hdr = " Size"; } if(opt & 2) { df_disp_hr = MEGABYTE; disp_units_hdr = "1M-blocks"; } #else opt = bb_getopt_ulflags(argc, argv, "k"); #endif bb_printf("Filesystem%11s%-15sUsed Available Use%% Mounted on\n", "", disp_units_hdr); mount_table = NULL; argv += optind; if (optind >= argc) { if (!(mount_table = setmntent(bb_path_mtab_file, "r"))) { bb_perror_msg_and_die(bb_path_mtab_file); } } do { const char *device; const char *mount_point; if (mount_table) { if (!(mount_entry = getmntent(mount_table))) { endmntent(mount_table); break; } } else { if (!(mount_point = *argv++)) { break; } if (!(mount_entry = find_mount_point(mount_point, bb_path_mtab_file))) { bb_error_msg("%s: can't find mount point.", mount_point); SET_ERROR: status = EXIT_FAILURE; continue; } } device = mount_entry->mnt_fsname; mount_point = mount_entry->mnt_dir; if (statfs(mount_point, &s) != 0) { bb_perror_msg("%s", mount_point); goto SET_ERROR; } if ((s.f_blocks > 0) || !mount_table){ blocks_used = s.f_blocks - s.f_bfree; blocks_percent_used = 0; if (blocks_used + s.f_bavail) { blocks_percent_used = (((long long) blocks_used) * 100 + (blocks_used + s.f_bavail)/2 ) / (blocks_used + s.f_bavail); } if (strcmp(device, "rootfs") == 0) { continue; } else if (strcmp(device, "/dev/root") == 0) { /* Adjusts device to be the real root device, * or leaves device alone if it can't find it */ if ((device = find_block_device("/")) == NULL) { goto SET_ERROR; } } #ifdef CONFIG_FEATURE_HUMAN_READABLE bb_printf("%-20s %9s ", device, make_human_readable_str(s.f_blocks, s.f_bsize, df_disp_hr)); bb_printf("%9s ", make_human_readable_str( (s.f_blocks - s.f_bfree), s.f_bsize, df_disp_hr)); bb_printf("%9s %3ld%% %s\n", make_human_readable_str(s.f_bavail, s.f_bsize, df_disp_hr), blocks_percent_used, mount_point); #else bb_printf("%-20s %9ld %9ld %9ld %3ld%% %s\n", device, kscale(s.f_blocks, s.f_bsize), kscale(s.f_blocks-s.f_bfree, s.f_bsize), kscale(s.f_bavail, s.f_bsize), blocks_percent_used, mount_point); #endif } } while (1); bb_fflush_stdout_and_exit(status); }