From 5911e56cc5a8a9f572a5887e232feb2a37df5159 Mon Sep 17 00:00:00 2001 From: ian Date: Wed, 18 Jul 2001 21:12:14 +0000 Subject: [PATCH] Found on jura. --- autotitle/Makefile | 21 ++ autotitle/autotitle | Bin 0 -> 11408 bytes autotitle/autotitle.c | 610 +++++++++++++++++++++++++++++++++++++++++ autotitle/autotitleaix | Bin 0 -> 33915 bytes autotitle/cusmake | 1 + autotitle/linuxcompile | 8 + autotitle/ursacompile | 1 + 7 files changed, 641 insertions(+) create mode 100644 autotitle/Makefile create mode 100755 autotitle/autotitle create mode 100644 autotitle/autotitle.c create mode 100755 autotitle/autotitleaix create mode 100644 autotitle/cusmake create mode 100644 autotitle/linuxcompile create mode 100644 autotitle/ursacompile diff --git a/autotitle/Makefile b/autotitle/Makefile new file mode 100644 index 0000000..028636a --- /dev/null +++ b/autotitle/Makefile @@ -0,0 +1,21 @@ +XLIB= -L/usr/local/X11R5/lib -lX11 + +installed= $(HOME)/bin/$(ARCH)/autotitle + +default: autotitle$(ARCH) + +install: $(installed) + +$(installed): autotitle$(ARCH) + strip autotitle$(ARCH) + rm -f $(HOME)/bin/$(ARCH)/autotitle + ln `pwd`/autotitle$(ARCH) $(HOME)/bin/$(ARCH)/autotitle + +autotitlesun4: autotitle.c Makefile + gcc -traditional -O -o autotitlesun4 autotitle.c $(XLIB) -DNOXTERM + +autotitlesun3: autotitle.c Makefile + gcc -traditional -O -o autotitlesun3 autotitle.c $(XLIB) -DNOXTERM + +autotitlemips: autotitle.c Makefile + cc -O -o autotitlemips autotitle.c $(XLIB) -DNOXTERM diff --git a/autotitle/autotitle b/autotitle/autotitle new file mode 100755 index 0000000000000000000000000000000000000000..8d51ae9d0f3bd897d3b5afc7cf1a766eec0c4134 GIT binary patch literal 11408 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 J0k~`Le*r)lJB9!N literal 0 HcmV?d00001 diff --git a/autotitle/autotitle.c b/autotitle/autotitle.c new file mode 100644 index 0000000..9858fa3 --- /dev/null +++ b/autotitle/autotitle.c @@ -0,0 +1,610 @@ +/* + * Autotitle - copyright (C)1991 Ian Jackson (iwj10@phx.cam.ac.uk) + * + * Automatically set window titles, prompts etc. + * + * Will output the string in AUTOTITLE_STDOUT (in the environment) + * to standard output, eg for use in your prompt. + * If it can find your X server or your TERM is xterm it will + * set your icon name to AUTOTITLE_ICON and your window name + * to AUTOTITLE_WINDOW. + * + * Defaults are, respectively, + * "" (ie no output) + * "%h: %d2. %Y.[U..[U..[D./..%X.L]..R]./.." + * "%h - %d. %Y.[U..[U..[D./..%X.L]..R]./.. %U%?G(%G)%!" + * + * Environment configuration strings work a bit like printf etc: + * + * Conversion characters + * %x Left edge position of window (if WINDOWID and DISPLAY set). + * %y Top edge height. + * %X.p..q..r./.s. (pqrstrings)[ len(str)*ypos/(yscreen-ysize+1)+0.5 ] + * %Y.p..q..r./.s. Same for x,y. If window is off screen, is string s. + * The dots are delimiters - any char allowed, must + * be same at both ends of one string p, q or r etc. + * Number of strings may be 1..oo but /.string. is mandatory. + * %d***. Current directory; examples of ***'s: + * %d2. Last two components only + * %d~. Display home directory as ~ (as opposed to '' or ~) + * %de. Never use PWD environment variable even if it is correct. + * %dE. Always use PWD environment variable. + * %dU. Use home directory for uid from passwd file, not $HOME + * %d3~U. Combination of the above. + * %n Nice value + * %N.p..q..r./.s. Like %Y and %X only for nice value (range 0..39) + * %U Name of uid + * %u Numerical uid + * %G Name of gid + * %g Numerical gid + * %E***. Environment variable ***, or null string. + * %m Umask in numerical form (3 digits) (as set by umask) + * %M Umask in rwx--- form (shows perms of file opened 777) + * %h Hostname, but truncated to just the host, not FQDN + * %H Hostname - FQDN if available, otherwise just machine + * %?g***%! Do *** if gid != default for this uid + * %?G***%! Do *** if gid or group name != $GROUP (or uid's grp if no $GROUP) + * %?u***%! Do *** if uid != $USER (or $LOGNAME if no $USER) + * %?n***%! Do *** if nice value != 20 + * %?mXXX***%! Do *** if umask != XXX + * %?E###.***%! Do *** if ### is not an environment variable. + * + */ + +#ifndef NOXWINDOWS +#include +#include +#include +#endif +#ifndef NOSTDLIB +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifndef PATH_MAX +#define PATH_MAX 1024 +#endif + +#define forever for(;;) + +/* #define NOXWINDOWS /* Define this to remove the X handling code */ +/* #define NODETACH /* Define this to stop autotitle from forking ever */ +/* #define NOXTERM /* Define this to make autotitle not set xterm's titles */ +/* #define NOSTDOUT /* Define this to disable the stdout output */ +#define DEFAULTTITLE "%h - %d. %Y.[U..[U..[D./..%X.L]..R]./.. %U%?G(%G)%!" +#define DEFAULTICON "%h: %d2. %Y.[U..[U..[D./..%X.L]..R]./.." + +#define BUILDMAX 1000 +#define SMALLBUFMAX 20 +#define MAXSCALED 15 + +#ifndef __HPUX +static char lto_buf[20]; +char *ltoa(n) long n; { sprintf(lto_buf,"%ld",n); return lto_buf; } +char *ltoaoct(n) long n; { sprintf(lto_buf,"%lo",n); return lto_buf; } +#else +# define ltoaoct(n) ltostr((n),8) +#endif + +#ifndef NOXWINDOWS +struct geom { + int valid; + struct geom *child; + Window window, root; + int x,y; + unsigned w,h; +}; +void geom_force(); +struct geom wg, rg={0,&wg}; +void X_force(); +int X_error_handler(); +#endif /* !NOXWINDOWS */ + +char *user_name(), *user_nameonly(), *user_home(); +void user_force(); +gid_t user_gid(); +struct passwd *pwent; +void uid_force(); +uid_t uid; + +char *group_name(); +void group_force(); +struct group *grent; +void gid_force(); +gid_t gid; + +char *cwd_force(); +void cwd_setmode(); +int cwd_mode; + +void mkstring(); + +char build[BUILDMAX], *bp; +char *bp_end= build+BUILDMAX; +char *cp; +char *envuser=0; + +int umsk; + +#ifndef NOXWINDOWS +Display *display; +Window window; +#endif +int iflevel, ifskiplevel; + +void add_string(), add_number(), add_scaled(), add_currentdir(); +void add_umask(), detach(), add_envir(); +char *scaledstr_chop(); + +main(){ + char *controlstring, *termtype; + int child, newfd; + + umsk= umask(0); umask(umsk); + +#ifndef NOSTDOUT + mkstring(0,0, "AUTOTITLE_STDOUT",""); + if (*build) { + write(1,build,strlen(build)); + } +#endif /* !NOSTDOUT */ + +#ifndef NOXTERM + termtype= getenv("TERM"); + if (termtype && !strcmp(termtype,"xterm")) { +# if !defined(NODETACH) && !defined(NOEARLYDETACH) + newfd=dup(2); + detach(); + dup(newfd); + close(newfd); +# endif + mkstring("\033]2;","\007", "AUTOTITLE_WINDOW",DEFAULTTITLE); + write(2,build,strlen(build)); + mkstring("\033]1;","\007", "AUTOTITLE_ICON",DEFAULTICON); + write(2,build,strlen(build)); +# if !defined(NODETACH) && defined(NOEARLYDETACH) + detach(); +# endif + } else { +#endif /* !NOXTERM */ +#ifndef NOXWINDOWS +# ifndef NODETACH + detach(); +# endif /* !NODETACH */ + X_force(); + if (window) { + mkstring(0,0, "AUTOTITLE_WINDOW",DEFAULTTITLE); + XStoreName(display,window,build); + mkstring(0,0, "AUTOTITLE_ICON",DEFAULTICON); + XSetIconName(display,window,build); + XSync(display,0); + } +#endif /* ~ NOXWINDOWS */ +#ifndef NOXTERM + } +#endif + exit(0); +} + +void mkstring(initialstring,finalstring,controlenv,controlstring) + char *initialstring, *finalstring; + char *controlenv, *controlstring; +{ + static char *envuser=0, *envstring, *envgroup=0; + int inc, chkum, ifskipthis; + char smallbuffer[SMALLBUFMAX+1], *p; + + envstring= getenv(controlenv); + if (envstring) controlstring= envstring; + + bp= build; + ifskiplevel=0; iflevel=0; + cp=controlstring; + if (initialstring) add_string(initialstring); + forever { + char *pcp= strchr(cp,'%'); + if (!pcp) { + add_string(cp); + break; + } + *pcp= 0; + add_string(cp); + cp= pcp+1; + switch (*cp++) { +#ifndef NOXWINDOWS + case 'y': geom_force(&wg); add_number(wg.y); break; + case 'Y': geom_force(&rg); add_scaled(wg.y,rg.h-wg.h+1); break; + case 'x': geom_force(&wg); add_number(wg.x); break; + case 'X': geom_force(&rg); add_scaled(wg.x,rg.w-wg.w+1); break; +#else + case 'X': case 'Y': add_scaled(MAXINT,0); /* skip scaled parameter */ + case 'x': case 'y': break; +#endif /* !NOXWINDOWS */ + case 'd': add_currentdir(); break; + case 'G': add_string(group_name()); break; + case 'g': gid_force(); add_number((long)gid); break; + case 'U': add_string(user_name()); break; + case 'u': uid_force(); add_number((long)uid); break; + case 'n': add_number(nice(0)); break; + case 'N': add_scaled(nice(0)+20,40); break; + case 'm': add_string(ltoaoct((long)umsk)); break; + case 'M': add_umask(umsk); break; + case 'E': add_envir(); break; + case 'h': case 'H': + if (!gethostname(smallbuffer,SMALLBUFMAX)) { + if (cp[-1] == 'h') { + p=strchr(smallbuffer,'.'); + if (p) *p=0; + } + add_string(smallbuffer); + } + break; + case '!': + if (iflevel>0) iflevel--; + if (ifskiplevel>0) ifskiplevel--; + break; + case '%': add_string("%%"); break; + case '?': + switch (*cp++) { + case 'E': + p= strchr(cp,'.'); + if (p) { + *p=0; + ifskipthis= 0!=getenv(cp); + cp= p+1; + } else ifskipthis=0; + break; + case 'g': gid_force(); ifskipthis= (gid==user_gid()); break; + case 'G': + gid_force(); + envgroup= envgroup?envgroup: getenv("GROUP"); + ifskipthis= + envgroup ? (gid==atol(envgroup) || !strcmp(group_name(),envgroup)) + : (gid==user_gid()); + break; + case 'u': + envuser= envuser?envuser: getenv("USER"); + envuser= envuser?envuser: getenv("LOGNAME"); + ifskipthis= (envuser && user_nameonly() && + !strcmp(envuser,user_nameonly())); + break; + case 'n': ifskipthis= (nice(0)==0); break; + case 'm': + if (sscanf(cp,"%3o%n",&chkum,&inc)==1) { + cp+=inc; + ifskipthis= umsk==chkum; + } + } /* switch() for if's */ + iflevel+=1; + ifskiplevel+= ifskiplevel ? 1 : ifskipthis; + break; + } /* switch for %'s */ + } + if (finalstring) add_string(finalstring); +} + +void add_envir() { + char *p, *e; + + p= strchr(cp,'.'); + if (p) { + *p=0; + e=getenv(cp); + cp=p+1; + if (e) add_string(e); + } +} + +void add_string(ns) + char *ns; +{ + char *nbp= bp+strlen(ns); + if (ifskiplevel || nbp > bp_end) return; + strcpy(bp,ns); + bp=nbp; +} + +void add_number(number) + long number; +{ + add_string(ltoa(number)); +} + +void add_scaled(num,denom) + int num,denom; +{ + char *sd, *sn[MAXSCALED]; + int n= 0; + double v; + + while (*cp && n1) { + add_string(sd); + } else { + add_string(sn[(int)(v*n)]); + } +} + +char *scaledstr_chop() { + char tc= *cp++; + char *rp= cp; + char *ep= strchr(cp,tc); + if (ep) { + cp= ep; + *cp++= 0; + } + return(rp); +} + +void add_umask(u) + int u; +{ + char buf[4], *bp; + int oi, h; + + if (ifskiplevel) return; + + for (oi=3; + oi; + oi--, u<<=3) { + strcpy(buf,"rwx"); + h= ((u>>6) & 7); + for (bp=buf; + bp1 && !strncmp(buf,homedir,len-1) && + (buf[len-1]=='/' || !(buf[len-1]))) { + strcpy(nbuf,homestring); + strcat(nbuf,buf+len); + buf= nbuf; + if (!strlen(buf)) buf="~"; + homeskip= strlen(homestring); + } + } + if (amdhome) { + len=strlen(amdhome); + if (amdhome[len-1] != '/') { + strcpy(nhome, amdhome); + strcat(nhome, "/"); + amdhome= nhome; + len++; + } + if (len>1 && !strncmp(buf,amdhome,len-1) && + (buf[len-1]=='/' || !(buf[len-1]))) { + strcpy(nbuf,homestring); + strcat(nbuf,buf+len); + buf= nbuf; + if (!strlen(buf)) buf="~"; + homeskip= strlen(homestring); + } + } + totalslashes=0; + for (p= buf+homeskip; *p; p++) + if (*p=='/') totalslashes++; + while (p>buf && p[-1]=='/') { *--p=0; totalslashes--; } + skipslashes= totalslashes-comps+1; + + for (p= buf+homeskip; + skipslashes>0; + p++) + if (*p=='/') skipslashes--; + if (p==buf+1 || p==buf+homeskip || p==buf+homeskip) p=buf; + + add_string(p); +} + +gid_t user_gid() { + user_force(); + return pwent? pwent->pw_gid: -1; +} + +char *user_nameonly() { + user_force(); + return pwent? pwent->pw_name: 0; +} + +char *user_home() { + user_force(); + return pwent? pwent->pw_dir: 0; +} + +char *user_name() { + user_force(); + if (pwent) return(pwent->pw_name); + return(ltoa((long)uid)); +} + +void uid_force() { + static int valid; + if (valid) return; + uid= getuid(); +} + +void user_force() { + static int valid; + if (valid) return; + uid_force(); + valid=1; + pwent= getpwuid(uid); +} + +char *group_name() { + group_force(); + if (grent) return(grent->gr_name); + return(ltoa((long)gid)); +} + +void group_force() { + static int valid; + if (valid) return; + gid_force(); + valid=1; + grent= getgrgid(gid); +} + +void gid_force() { + static int valid; + if (valid) return; + gid= getgid(); +} + +void cwd_setmode(mode) + int mode; +{ + cwd_mode=mode; /* 0= default, 1= 'e', 2= 'E' */ +} + +int different_files(a,b) + char *a, *b; +{ + struct stat staa, stab; + + return stat(a,&staa) || stat(b,&stab) || + staa.st_ino != stab.st_ino || staa.st_dev != stab.st_dev; +} + +char *cwd_force() { + static int valid=0, fail; + static char buffer[PATH_MAX+1]; + if (!valid) { + if (cwd_mode!=1 /* not 'e' */) { + char *result= getenv("PWD"); + if (result && (cwd_mode /* 'E' */ || !different_files(".",result))) { + strncpy(buffer,result,PATH_MAX); buffer[PATH_MAX]=0; + valid= 1; + } + } + if (!valid) { + valid= getcwd(buffer,PATH_MAX)!=0; + } + valid=1; + } + return buffer; +} + +#if (!defined(NOXWINDOWS) || !defined(NOXTERM)) && !defined(NODETACH) +void detach() { + close(0); close(1); close(2); if (fork()!=0) exit(0); +} +#endif /* !NODETACH */ + +#ifndef NOXWINDOWS + +void X_force() { + static valid; + char *widname, *dispname; + + if (valid) return; + window= (XID)0; display= (Display*)0; + XSetErrorHandler(X_error_handler); + + dispname= getenv("DISPLAY"); + if (!dispname) return; + display= XOpenDisplay(dispname); + if (!display) return; + + widname= getenv("WINDOWID"); + if (!widname) return; + window= (XID)(atol(widname)); + wg.window= window; +} + +int X_error_handler(edisp,eevent) + Display *edisp; + XErrorEvent *eevent; +{ + display= (Display*)0; + window= (XID)0; + wg.window= rg.window= window; + wg.x= wg.y= rg.x= rg.y= -1000; + return(0); +} + +void geom_force(g) + struct geom *g; +{ + unsigned dummyu; + int dummys; + Window dummyw; + + if (g->valid) return; + if (g->child) { + geom_force(g->child); + g->window= g->child->root; + } + X_force(); + if (g->window) { + XGetGeometry(display, + g->window,&g->root, + &dummys,&dummys,&g->w,&g->h, + &dummyu,&dummyu); + XTranslateCoordinates(display,g->window,g->root,0,0,&g->x,&g->y,&dummyw); + } else { + g->x= -1000; + g->y= -1000; + } + g->valid= 1; +} +#endif /* !NOXWINDOWS */ diff --git a/autotitle/autotitleaix b/autotitle/autotitleaix new file mode 100755 index 0000000000000000000000000000000000000000..67faa6c25ce33a1509b302250c13a991f6474034 GIT binary patch literal 33915 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