|
|
1.1 ! root 1: #include "univ.h" ! 2: #include <CC/sys/types.h> ! 3: #include <sys/param.h> ! 4: #include <CC/sys/stat.h> ! 5: #include <dirent.h> ! 6: #include "wd.h" ! 7: SRCFILE("wd.c") ! 8: ! 9: void NewWd() { new Wd; } ! 10: ! 11: Wd::Wd() ! 12: { ! 13: pad = new Pad((PadRcv*) this); ! 14: pad->name("pwd/cd"); ! 15: pad->banner("Working Directory:"); ! 16: prevwd = 0; ! 17: pwd(); ! 18: } ! 19: ! 20: Index Wd::carte() ! 21: { ! 22: struct stat stbuf; ! 23: Menu m; ! 24: struct dirent *dp; ! 25: DIR *dirp; ! 26: ! 27: dirp = ::opendir("."); ! 28: if (dirp == NULL) ! 29: return m.index(); ! 30: for ( dp = ::readdir(dirp); dp!=NULL; dp=::readdir(dirp) ) { ! 31: char dn[25]; ! 32: sprintf(dn, "%0.25s", dp->d_name); ! 33: int len = strlen(dn); ! 34: if( len>=3 && dn[len-2]=='.' ) continue; ! 35: if( dp->d_ino == 0 ! 36: || ::stat(dn, &stbuf)== -1 ! 37: || (stbuf.st_mode&S_IFMT)!=S_IFDIR ) ! 38: continue; ! 39: long opand = (long) sf("%s/%s", getwd, dn); ! 40: m.sort(sf("%s\240", dn), (Action)&Wd::kbd, opand); ! 41: } ! 42: ::closedir(dirp); ! 43: return m.index(); ! 44: } ! 45: ! 46: char *Getwd() ! 47: { ! 48: char pathname[MAXPATHLEN]; ! 49: char *getwd(char*); ! 50: ! 51: if (getwd(pathname) == 0) ! 52: return "getwd error"; ! 53: return sf("%s",pathname); ! 54: } ! 55: ! 56: char *Wd::help() ! 57: { ! 58: trace( "%d.help()", this ); ! 59: return "[cd] <path> {change working directory}"; ! 60: } ! 61: ! 62: char *Wd::kbd(char *s) ! 63: { ! 64: trace( "%d.kbd(%s)", this, s ); OK("kbd"); ! 65: if( s[0]=='c' && s[1]=='d' && (s[2]==' '||s[2]==0) ) s += 2; ! 66: while( *s == ' ' ) ++s; ! 67: if( *s==0 ){ ! 68: char *getenv(char*), *e = getenv("HOME"); ! 69: if( e ) s = e; ! 70: } ! 71: if( chdir(s) == -1 ){ ! 72: pad->insert(key++, "cannot cd %s", s); ! 73: prevwd = 0; ! 74: } ! 75: pwd(SELECTLINE); ! 76: return 0; ! 77: } ! 78: ! 79: void Wd::pwd(Attrib a) ! 80: { ! 81: if( prevwd ) ! 82: pad->insert(key, a, (PadRcv*)this, ix, "%s", getwd); ! 83: getwd = Getwd(); ! 84: ix = carte(); ! 85: pad->menu(ix); ! 86: pad->insert(++key, a|DONT_CUT, (PadRcv*)this, ix, "wd=%s", getwd); ! 87: prevwd = getwd; ! 88: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.