/***************************************************************************** Application ASH: fullinfo.c (c) Pierre Adriaans 1994 ------------------------------------------------------------------------------ Fonction d'affichage des informations completes concernant un fichier. *****************************************************************************/ #include "ash.h" extern char DummyStr[DUMMYSTR_SIZE]; /***************************************************************************** FullInfo() ------------------------------------------------------------------------------ Input,Output: / Process: affichage de tous les renseignements concernant le fichier en inverse. *****************************************************************************/ void FullInfo(FileInfo_t Entry) { struct passwd *pw; struct group *grp; char Date[30]; char Line[80]; static char Buf[256]; int i,X,Y,rc; GetXY(&X,&Y); Line[0] = F_BDSD; for(i=1;i<59;i++) Line[i] = F_S_HO; Line[i] = F_SDBD; Line[i+1] = 0; OpenWin(3,11,20,60,FullInfoBold,DOUBLE_FRAMED,SHADED); WriteString(" Complete File Information ",FullInfoBold,4,26); WriteString(Line,FullInfoBold,5,11); SetCurrentAtt(FullInfoBold); Printf("\n\nFilename: "); SetCurrentAtt(FullInfoNorm); #ifdef BSD_SYMBOLIC_LINKS rc = -1; if(IS_SYMLINK(Entry.s.st_mode)) { rc = readlink(Entry.Name,Buf,255); if(rc == -1) Buf[0] = 0; else Buf[rc] = 0; } if(rc != -1) { if(Entry.Name[0] == PATH_SEPARATOR_CHAR) strcpy(DummyStr,Entry.Name + 1); else strcpy(DummyStr,Entry.Name); if(strlen(DummyStr) > 21) { DummyStr[18] = 0; strcat(DummyStr,"..."); } strcat(DummyStr," -> "); strcat(DummyStr,Buf); if(strlen(DummyStr) > 46) { DummyStr[43] = 0; strcat(DummyStr,"..."); } Printf("%s\n\n",DummyStr); } else #endif { if(strlen(Entry.Name) > 46) { strcpy(DummyStr,Entry.Name); DummyStr[43] = 0; strcat(DummyStr,"..."); if(DummyStr[0] == PATH_SEPARATOR_CHAR) Printf("%s\n\n",DummyStr + 1); else Printf("%s\n\n",DummyStr); } else if(Entry.Name[0] == PATH_SEPARATOR_CHAR) Printf("%s\n\n",Entry.Name + 1); else Printf("%s\n\n",Entry.Name); } WriteString(Line,FullInfoBold,7,11); GotoXY(7,46); SetCurrentAtt(FullInfoBold); Printf("%c",F_SBSS); SetCurrentAtt(FullInfoBold); GotoXY(8,13); Printf("File Type: "); SetCurrentAtt(FullInfoNorm); if(IS_FIFO(Entry.s.st_mode)) Printf("Pipe "); else if(IS_DIR(Entry.s.st_mode)) Printf("Directory "); else if(IS_SCHR(Entry.s.st_mode)) Printf("Character Device "); else if(IS_SBLK(Entry.s.st_mode)) Printf("Block Device "); else if(IS_ORD(Entry.s.st_mode)) Printf("Ordinary File "); else if(IS_SOCKET(Entry.s.st_mode)) Printf("Socket "); else if(IS_SYMLINK(Entry.s.st_mode)) Printf("Symbolic link "); else Printf("Unknown "); SetCurrentAtt(FullInfoBold); Printf("%c\n",F_S_VE); SetCurrentAtt(FullInfoNorm); SetCurrentAtt(FullInfoBold); Printf("Size in bytes: "); SetCurrentAtt(FullInfoNorm); Printf("%-17ld",Entry.s.st_size); SetCurrentAtt(FullInfoBold); Printf("%c\nInode Number: ",F_S_VE); SetCurrentAtt(FullInfoNorm); Printf("%-17d",Entry.s.st_ino); SetCurrentAtt(FullInfoBold); Printf("%c\nLinks: ",F_S_VE); SetCurrentAtt(FullInfoNorm); Printf("%-17ld",Entry.s.st_nlink,F_S_VE); SetCurrentAtt(FullInfoBold); Printf("%c\nSticky bit: ",F_S_VE); SetCurrentAtt(FullInfoNorm); if(STICKY_BIT(Entry.s.st_mode)) Printf("ON "); else Printf("OFF "); SetCurrentAtt(FullInfoBold); Printf("%c",F_S_VE); GotoXY(13,46); Printf("%c",F_S_VE); GotoXY(8,48); Printf("Owner: "); SetCurrentAtt(FullInfoNorm); if(IS_RUSR(Entry.s.st_mode)) Printf("r"); else Printf("-"); if(IS_WUSR(Entry.s.st_mode)) Printf("w"); else Printf("-"); if(IS_XUSR(Entry.s.st_mode)) Printf("x"); else Printf("-"); GotoXY(9,48); SetCurrentAtt(FullInfoBold); Printf("Group: "); SetCurrentAtt(FullInfoNorm); if(IS_RGRP(Entry.s.st_mode)) Printf("r"); else Printf("-"); if(IS_WGRP(Entry.s.st_mode)) Printf("w"); else Printf("-"); if(IS_XGRP(Entry.s.st_mode)) Printf("x"); else Printf("-"); GotoXY(10,48); SetCurrentAtt(FullInfoBold); Printf("Other: "); SetCurrentAtt(FullInfoNorm); if(IS_ROTH(Entry.s.st_mode)) Printf("r"); else Printf("-"); if(IS_WOTH(Entry.s.st_mode)) Printf("w"); else Printf("-"); if(IS_XOTH(Entry.s.st_mode)) Printf("x"); else Printf("-"); GotoXY(11,48); SetCurrentAtt(FullInfoBold); Printf("set-uid: "); SetCurrentAtt(FullInfoNorm); if(SET_UID_ON(Entry.s.st_mode)) Printf("ON"); else Printf("OFF"); GotoXY(12,48); SetCurrentAtt(FullInfoBold); Printf("set-gid: "); SetCurrentAtt(FullInfoNorm); if(SET_GID_ON(Entry.s.st_mode)) Printf("ON"); else Printf("OFF"); WriteString(Line,FullInfoBold,13,11); SetCurrentAtt(FullInfoBold); GotoXY(13,46); Printf("%c",F_SSSB); GotoXY(14,13); SetCurrentAtt(FullInfoBold); Printf("Owner Name: "); SetCurrentAtt(FullInfoNorm); if((pw = getpwuid(Entry.s.st_uid)) == NULL) Printf("???\n"); else Printf("%s (Owner ID: %ld)\n",pw->pw_name,Entry.s.st_uid); SetCurrentAtt(FullInfoBold); Printf("Group Name: "); fflush(stdout); SetCurrentAtt(FullInfoNorm); if((grp = getgrgid(Entry.s.st_gid)) == NULL) Printf("???\n\n"); else Printf("%s (Group ID: %ld)\n\n",grp->gr_name,Entry.s.st_gid); WriteString(Line,FullInfoBold,16,11); SetCurrentAtt(FullInfoBold); Printf("Last Acces: "); SetCurrentAtt(FullInfoNorm); ConvertDate(Date,Entry.s.st_atime); Printf("%s\n",Date); SetCurrentAtt(FullInfoBold); Printf("Last Data Modification: "); SetCurrentAtt(FullInfoNorm); ConvertDate(Date,Entry.s.st_mtime); Printf("%s\n",Date); SetCurrentAtt(FullInfoBold); Printf("Last Status Modification: "); SetCurrentAtt(FullInfoNorm); ConvertDate(Date,Entry.s.st_ctime); Printf("%s",Date); SetCurrentAtt(FullInfoBold); WriteString(Line,FullInfoBold,20,11); GotoXY(21,28); SetCurrentAtt(FullInfoInv); Printf(" Press a key to close... "); SetCurrentAtt(FullInfoNorm); GotoXY(X,Y); fflush(stdout); ReadKbd(); CloseWin(); }