static void getstat(void) { /* set status line */ int i; if (mip->ERNUM) instat(erptr,"ERROR"); else instat(erptr," "); if (mip->EXACT) instat(exptr,"EXACT"); else instat(exptr," "); if (size(m)!=0) instat(mmptr,"MEM"); else instat(mmptr," "); if (mip->RPOINT) instat(typtr,"POINT"); else instat(typtr,"FRACT"); for (i=0;i<4;i++) instat(stptr[i],settings[i][option[i]]); }
/* **************************************************************** * Imprime os símbolos de um módulo * **************************************************************** */ void list_mod (const MOD *mp) { const SYMTB *zp; const char *cp, *tp; STAT s; char first = 1; printf ("\n"); if (vflag) { if (instat (lib_dev, mp->m_ino, &s) >= 0) { cp = modetostr (s.st_mode); tp = btime (&s.st_mtime); printf ( "%s %-14.14s %6d %-5.5s %-15.15s ", cp + 14, pwcache (s.st_uid), s.st_size, tp, tp + 9 ); } } printf (mp->m_mod_nm); /* * Imprime os símbolos */ if (vflag) printf ("\n\nSímbolos: "); else printf (": "); for (zp = mp->m_sym; zp != NOSYMTB; zp = zp->z_sym_next) { if (first) first = 0; else printf (", "); printf ("%s", zp->z_sym_nm); } printf ("\n"); } /* end list_mod */
/* **************************************************************** * Calcula o total de uma <árvore> * **************************************************************** */ long file_analysis (const char *file_nm, int file_len, int dev, int ino, int root) { DIR *dir_fd; const DIRENT *dp; long dir_total = 0; char *memnm; STAT s; NAME name_list, *lp, *ip; if (gflag) error ("file_analysis (%s, %d)", file_nm, root); /* * Inicialmente, obtém o estado do arquivo */ if (instat (dev, ino, &s) < 0) { error ("*Não consegui obter o estado de \"%s\"", file_nm); ret++; return (0); } /* ****** Arquivo NÃO-diretório *********************************** */ if (!S_ISDIR (s.st_mode)) { int blsize; if (!pattern_accept (file_nm)) return (0); if (s.st_nlink > 1 && proc_link (&s)) { if (gflag) printf ("L %s\n", file_nm); return (0); } blsize = round_file_size_to_BL (&s); if (aflag && !root) printf (du_fmt, edit_sz_value (blsize), file_nm); return (blsize); } /* ****** Diretório *********************************************** */ if ((dir_fd = inopendir (s.st_dev, s.st_ino)) == NODIR) { error ("*Não consegui abrir o diretório \"%s\"", file_nm); ret++; return (0); } /* * Lê o conteúdo do diretório */ name_list.i_next = NONAME; ip = alloca (sizeof (NAME)); while ((dp = readdir (dir_fd)) != NODIRENT) { if (dp->d_name[0] == '.') { if (!dotflag) continue; elif (dp->d_name[1] == '\0') continue; elif (dp->d_name[1] == '.' && dp->d_name[2] == '\0') continue; } ip->i_nm = alloca (dp->d_namlen + 1); strcpy (ip->i_nm, dp->d_name); ip->i_len = dp->d_namlen; ip->i_ino = dp->d_ino; /* * Completa os campos de NAME */ /*** ip->i_nm = ... ***/ /* Acima */ /*** ip->i_s = ... ***/ /* Acima */ /*** ip->i_next = ... ***/ /* Abaixo */ /* * Insere na lista */ for (lp = &name_list; lp->i_next != NONAME; lp = lp->i_next) { if (strcmp (ip->i_nm, lp->i_next->i_nm) <= 0) break; } ip->i_next = lp->i_next; lp->i_next = ip; ip = alloca (sizeof (NAME)); /* Já aloca um seguinte */ } /* end lendo o diretório */ closedir (dir_fd); /* * Agora, processa a lista */ for (ip = name_list.i_next; ip != NONAME; ip = ip->i_next) { int len = file_len + ip->i_len + 1; memnm = alloca (len + 1); if (streq (file_nm, ".")) { strcpy (memnm, ip->i_nm); len = ip->i_len; } else { strcpy (memnm, file_nm); strcat (memnm, "/"); strcat (memnm, ip->i_nm); } dir_total += file_analysis (memnm, len, s.st_dev, ip->i_ino, 0 /* Not root */); } /* * Terminou de processar o diretório * Não esquecer de contar o tamanho do próprio diretório */ dir_total += round_file_size_to_BL (&s); if (dflag && !root) printf (du_fmt, edit_sz_value (dir_total), file_nm); return (dir_total); } /* end file_analysis */