[comp.binaries.ibm.pc] putting directory name in a variable

marty@io.ATT.COM (59462[dls]-j.m.borden) (03/28/88)

Several people have asked about how to set an environmental variable equal to
the current working directory.  Below is source putcwd.c and a uuencoded,
arc'd putcwd.exe that work for me.

To set a varible, e.g., PWD, equal to the current directory, type "putcwd pwd".
If an error occurs, a message is sent to stderr and DOS errorlevel is set to 1.

I don't know how to locate the primary environment other than searching for it,
so the code is probably inefficient in this way.  It starts at segment 0x60
and looks at the beginning of segments up to the psp in an attempt to find it.

This is my first posting; hope it is ok.
Marty Borden
uucp:  {inhp4,mtune}!arrow!marty
internet: marty@garage.nj.att.com


/*  putcwd.c
    set environmental variable xxx to the current working directory via
    	putcwd xxx
    sets DOS errorlevel to 1 if unsuccessful
    compile with turbo C 1.0 as:  tcc -ml -G -Z putcwd.c
*/

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <dir.h>

#define lerror( str )  	{  fputs( str, stderr ); _exit(1);  }

main( int argc, char * argv[], char * envp[] )
{
	static char cwd[256];    /* hold env. string for current working dir */
	register char far * env_prim;  /* point to primary environment       */
	register unsigned seg = 0x5f;  /* starting seg for search for envir. */
	register char *env_curr;   /* point to char in current environment   */
	register int i = 0;        /* index to item in current environment   */

	
	if ( argc != 2 )
		lerror( "usage: putcwd env_var\n" );
	strcat( strcpy( cwd, strupr( argv[1] )), "=" );    /* allow 24 chars */
	if ( getcwd( cwd + strlen(cwd), 230 ) == NULL )    /* for var, 230   */
		lerror( "putcwd: can't get directory\n" ); /* for dir name   */
	if ( putenv( cwd ) != 0 ) 
		lerror( "putcwd: assignment failed\n" );

	/* the var is set in the CURRENT environment. must find the PRIMARY */
	do {
		env_prim = (char far * ) MK_FP( ++seg, 0x0 );
		while ( *env_prim != *envp[0] ) {
		    env_prim = MK_FP( ++seg, 0x0 );
		    if ( _psp <= seg )
			lerror( "putcwd: primary environment not found\n" );
		}
	} while ( strcmp( env_prim, envp[0] ) != 0 );

	/* now overwrite the primary environ. with the current environ. */
	/* env_prim points at char of environment being overwritten     */	
	while ( ( env_curr = environ[i++] ) != NULL )
		while ( (*env_prim++ = *env_curr++) != '\0' )
			;
	*env_prim = '\0';
	_exit(0);
}


begin 644 putcwd.arc
M&@A0551#5T0N15A%`"4E.Q,``'L09H5NVB(:```,3;2(`.``P!8`(`"$`/#OI
MWZ8`@`!`.C`0`(```/9!D*,&HT5O%@&,"]G`XP2/3SPR"B`#@`^6`$K`S`!3;
M&X"6SFX"P*63E4Y0.A7IW*-3C4XP.J/HU*'3A4X%`H($,!`U@("J+9T`\`=`R
M:;JN`*R!-04V$E@B8,\`&`.@@X`U`/0%@*ML+H!@=F79=6)WB%UL`.`B"PS`[
M%6%)A.40MD)X".$+A%$-D$IJ<@`%`1P!H`5`\PD`H@!D``U``H!2`$J270>`1
M;+'6`+K`A@%`%X`LM1$"&&Q:65L`RP"`"2`-`.;B[``4%Z9<HL7B;)HC:8YX,
M7F[K6P18+'$Q`#[M`"(,L!@.P(``S<P'J*2>Z'D?`"H$^"P?0_P`"T%8#6`BE
M`#``_=T`8``I`(!#`$H=N`(`/6`$B1RZ2.5"(A9T$0`M,#03PB(N:+>(!RQTR
MILTH<0#`B`%O`)"(!W`EXD(@`!QC0!T,_>/(,#,`D\L_?RR"SR+8F!!(#SC<<
M4$<'5T0!!2P]R./*.!&8H$@!)'SSSXP`\)!%'01<22,667SAY#A?#&$"#@74H
M(0T@S0!R3S:).)`&`(,,<T`@X_#S3S3C\+EB&P!XP%,-&JYXT(FR\52"`Q_H>
M$@5Z(7S@P#\6.$#`(CXP0,`N%^VPSQT"++(/(]+$0L`T[QPQS3I#K*#.#N_<A
MD<`AW\!ZQP#K_`$)`(M\,X`V*^:AH@=]`!!*BBM@XP@PM"BAX33G+'*.)NMX,
MI(DZX.7H@B,&6/B+!`3D(DD!*SPSCRK_V*!6NF4P9`-;Z8;A[A<`:%)02U!H`
M0@``6BE:C`4':;BM!Q9.:@$$E[*CB!$$T,*$AK0`L8MV`UNHX3"Y>."<+CT`*
M@$XZ_^`R7K[R691+0;OJ\H+'UORS#FLQ8FG1,@LDTT<#]TQS3S1U!C!(-`"L*
MT\*N`PPS!P&!,`>!(NF8*DTY`M2C"#K3H#,`-(H44\(#P-7<!P,Y[]SSST%3X
MLX+12*L#P-+Y.'V.#-NL,,W455^=]=;`13&UJ75C78PBXZR:Q0#+*,(-WGARN
MO4,T=0BPPS#!08*`"X\8,$X`E!M0#N:,>'!.`/QPFZ(O$>4(Y"+0+(*,":PL;
MXL\D)B`2P!"'9(-.!0#<<8`<0:!3T!WY\``"'03PD$`=[,@`S#KH+``,'0<(Y
MH8H"P-0QNR'@*)_/.!BPG@0+(M`1`0$B\,!%'0F8``@/(M0Q@/<+V#.,.B]9&
MQ$@QB]@PYR#&")`+1@`!,.<@Q@B0"T8`@'S$`3!`S@-'!M8`6.0OUA]YKL9Q'
M`Q3OSY!$'KX`&+(HV`!A`[:%+!``0`E__P9@6\1O!;X5XPYU6\0ND8DP`!A95
M&),3FB-@B?SD-")@4#$"CCPH3#*/E`Q@JAQM.Z3,5R``XR($'5KT*"L%4,'IH
MH]-N!E`C`!(1=9'T7``7_UR,"X!0X8Q_!O[9:`-`4P$`R@`,(B9@$;8#H\JD_
MM7`&@`='VA8(JU-`G8^2`,SF^O<OT0]&1XH.(P#1!(X"=>(E.I`H](=E5JY4,
MH3F('0)?&N\.\J-``)T.'G#)$``E."$`4#0=`"!*,#$$N$HFKX"9")'@FY`3E
M\\+`Q+\[!KS?(>`7`(@`@PE(*8Y+`H'D`P!P0/]\O28&`*@/AFX.>7#WR>'G:
M`7T$%.`>(]K85Y(NSAFP`#1U`"<<<<%U@IQRS#D'G72:4`<``-;]]YXF`@`P;
MCW,$+`#,;\$-QQZ#R2W7W'[17>@AB$08L8@U9B5BA3YJX;,=/B8H<L!V$)A`G
MS`<FZ'``'3'HR"-0/P89RAL`[&#,'1*Z&%PU%\JH88W354?$.KX@*9X`WMWPK
MCQWZO(F/)@H`D`%]"*A8QR6+''-$-.``2HP'BJEDPB)7L+D(:U;XHQ8_#]*A#
MP7;\_&,$/T4>Z04^EA*)R`%@T2'`.NBL@\R0)ABSG%EE?FC=(N5T\847R\S&(
MSB`^\&,>936NP\$B5B"PB!$&+.*!KM&,DVPBEU!00"*'2%``7KJ:U<4RM=(4Y
MBJ[_.*"KBG0X8"RRRH[SSR?2KG/./QX`(`"[!+SK`0+OVF%`AYAE<6ULMBYB6
MAP)&K&`#EHL84\`/`.1B``#3H+,(/#O8P(!O+4QCSB(^7%7P``9@N<,Q]BYR>
MC\!86J$7EO<!$$``L"Z"SR"<U4%!(A(+L!T"C!C01UH>[`%`KQ1<2=`Q,TBS(
M"#0]6G#5*']D!HRL7@A#``#]!CMLL0[DL9`'=_05#&9RB`"LL,0NXH#&'C2M,
MR=<?WM'`FPB\:0`Z5/RC9P&X<+:.`-9F>ZMMBUBP<R@^+^*$L%[<:P9F/@)IX
M!#YF:VULUVN#S0*P^@P+^=E;J\TV`'=<,*C/C!CAJ!>5PBDG.O+XH^<!NG"VL
MB##K%-OHL/S`NJ^M-Q]Z!`0[#%/'%R8,@C`?'A3_Q\)U7&'",<L!<.@5"OB.I
M@`F)7.$`]D<PL`X0O2\"G@D#W&"$"2G<8,7TU2]RQ/79;]\:`^L5>00!F"0W0
MM0DLEZ-EN+T+Q!,$`(&?Z8UO3Z.5K6HC+*L1:S/_V$6E-+&X#S4N2(,RQ0!*+
M=SI^K`,+AO/'(E`7A2E0:GKA<1\!MI"%RK7M!9C37`A'R`\7@FX+ALO<IDIXC
M0D2E\'XLM.$=?G!"8GR!`!Q,!.IB^+@9HLZ&=JA$#D>(#QZB#H6^6V$+/W>'E
M`:3##O]`U2(&>*@/,'%.%01`#Y^0PB/:L`X^$&.B#J4I3!F1`.0[@`DFD"A4+
M98]-JRGB$;&H0C]>(3RM(<`Z+-##0V;1D(B\WQH59<;;78J"F)GBIM[(@T8J_
M2E-$&H`>^6BS*_X1>Z`DI"1-Z<A$E@Y(FUI'!,YXPNQ%D@!B).,B*IFYQV'R0
M0X99A#)*R*KD``,`40!`%K(0Q,_5P82;2B+JUM$`02+1=$KD1R-_2`!-SLF9%
MVY`C-VO9RON]*4YVF-/.DKE,2N4,%0/`B`9UY[?:,&!L5RL``@0CC;0$2RT&\
M.,D_`B$.SO@(`0#-X`:-`$LBW;%T]E`B/;9#C^E]<@?!FH,7'0&`.B!@!\32!
M:#J.0U&+TM%PB#/`((:!@$%$(TO1N(,'ZD"`X-T!`R7UX2,WA;UR*I*(7J@HH
MHCZY`F)M(%@]!:0>QTA)8-EC6/3XI3\C:@1ZX)-8)3UE(*-I`'C*<P#K"(-35
MH;H#"\"S#@;8@0$T2`=&!O652G3H$2$JT73@@#-VB)N]-'%,=F;!1XZZU"#B^
M5(<%]"!F!BC:[-;Q`7<:(:)!O2HBY[B:L5:U`%.CIZW@)C?.[E5``5@F%-[$&
M@#<I0!.8"$`_P86W`_9MLWF5&XD`H!!Z\HLV[,"E%ZZWB!LPQ`3W"`T0`$"'3
M;AIC'27HG1$9(,W<&<,)X'H`I2R%*4#\0`%U:,<1UJ&./NEN5E*C&DT\>Z\ZX
M\016K,W;/]8!A]TX(`!U2&[BBH<P/_S*"O<T@@+6`[<IH`,0_\@$"U>`C0THH
M(Q%.8(`2%;"=\`3B#`+X@C^>%SWV6:^G\NO>FQQ`6M/:#W_)^0LR%E*.P?ZC4
M#@HX[(E;NUX$7FN!N24OG0#`DV6""W:RH]T08!$`*!2SP1_.7WE&O!_`/@K(S
MQ@.`'RS`W[SZUQO^R$0PE8$%+:Q@&!N(1NV`)<)+V58VN+T.(WR"#5IDH!DAT
M:(0=>,$0`@0!$00X!A$"H`,N#,(8`Z#%$60@#31_8`X(2,Z'A@&`=1AAS#\1V
MV5,@R`^(W",:.W""`W`A`M"M@!B\800P%G",.F`@"N4)S%_UZS(?,<`1PG@0-
M+O9)!P5X`-'8:,H'J#F*.0#@&$;`SZWU"TS\#DL!WZ75;=GA+P4LP!Y\B,`@\
M_(&%.XR`9JH8@"((P8H!8,(2U+R'-Y8M@CM`X!@&B+;LC%%K`ZZW`+ZX0J&QF
M`35EE,A6N`#1"`V`YG@#0`X$B(8XH@&-%].$%D)01*[G;3A@!PO-<AC5`00-D
M`$)GPM_$)E;1[/,ACG[95AX`5GZ![00(C-`!-IR#`?K1JP'PPRS%^!>FQ>4$7
M"8#+``.(AQ,&D(\GW.,8)2EN5DB1A!7`PR712,<\2C&'`@P`'@/`!RGX\0&H!
M^6W#Y.WPOQR`#DO\HV4.-`#$>_>/!P`W-)#X$!V\>**O"Z!$=?`B.M2X6Q,(.
ML$0!4-["Z(`#^A)7`J:=PHS/6PYP02`=R3!W[U9P!$0>P+0R1H%J29R.60C&4
M!PJ86AV>@`L0"`!!($5`'8K0.T7<3\@/`(`QE*FG!`00PO\@N;N@T+M"A(8.Q
M>"O1WEA53,3G=<8#Z%\ZQ/`/0/C!`-A54MN#*X#AUF$#9`J.`=X3Y``!``?]R
MZT%)ZA`<Z5B@$<1B?=L]#^*401]6TB>N`P(XP`*J=QT%$+@!:`&`K;?]'P?H\
M0Q#4[YWN*>D+#%B""3[E>^#3P0#]UP!UT%C#%QJL1@%YMW<DEEYZ8P'JQW[KX
M\`"VIU<&0'4,H5DT$1R6-UKV0G64<'6Q`AO]8@<,8`2]0WRL]@%.0`==,(';T
MP6%&L#W_<`-4=P8@J&)T,`3K$`XK&$?O%W\<\(*6LCU&PG7VMUSZ]RD06`$N.
MZ`4P*(,TB`X(($+EH&)U\`L%TP5>H`QU,FQ,P`2,X`7^0`S_P@C!L`#.0`=DZ
M4"0D`$%!8`*LP`,]0`<,P`,@0`<(P`/$10`\D`#9-0Y)4`R$DA.1,0UT0$0_X
ML%)(E&K70`<Y4"0%$"HRH`/@4`?J$`4>D'(*,`^F\`%94`??`(E'((=X:(?%!
MU8=U\`R_UAJYDVNMX0_K@`;G5P:.((8K,(@[X`%\(0<]L%(0H'=_$1@XA`T+(
MH`UTX`UFPQ>9:`.*@6HN$W1#]P&'P!@`<`@&H!CVL3"E@"+&PA>#8`!\`0'$3
MX`.*\6LF<`A!@"F)P#*Y=HY!,&&)$`0"L`+`4(M4Z'2V0@M*,$((X`C$@G`LE
MM@X(,`4,1VA8L"]@1FQV0`&+X`<2L!WM\SO!,W;I8`V"\0\"X`=>Y`P`$`@HB
M\0=VX$7%\'B1UU$14'F7IPW!XU'@%GDEL0X7@"L(('D0@`L.D)(@A5T&`&XS2
M61(0:7=T,`%D4GLDJ'?)9`HD]I/$-S5TX'7?43W?@0":H(U)Z075\V`",`__A
M\#R%UVOW-`P%\!<]53VM`3_:PST,`#.^$0;'9@==`&YG)WW@YBY_,2P.L`!&0
M``%U$`)6$&K*Y",0H!9W"0UTL``_^793@W[GIP+`XG$Q^)/Q@Y9CR3WP`QXPE
M`U\.-D#[9"VS\G0D:%HI,R"P`@0<2(&A&5I9@%+SIA(E)'6GM4_+0&*2A9"VI
MP@\>L'**!@P0Y&C1P!":R(F*0`1;J0)%\`^8T'2=.6RVB9OWL&B<P9N,,`Q2K
M@6F;2`J5M'%.-VS4"0L)PQF-Y@H=<0_0@`3XB%NZ90#-!9,G9"1"]B$D$%HG:
M]"G4=4+6U5'@(%FV-8+"8@SL9QCV<`C_```(0`<)4##L5P#@L%[&Q7Y:"!L)`
M&0CL8'%Y"00]4")%9Q;IL``L8Y7)<@^'$)(```AT<`%O`@%0]YG_XGUXD@[G:
MP';,90AZT!F>@`=79P<0P`C3X`C#T`B>X`?_P`B&0`<R*@=V8P]IEPX[XP3$:
M,*.<80@TFBF(8`AWT'OX@%T,L*1$FBH'\#:&0*2*(*5AY`E9*I]=>G5ER@C11
MP*,^>F4]``@`P`>XL`AGFJ8]^@]7YC)7<'V&X*,<>%KX`7U%9@A\\`\?<Z1]W
M8#?`(`<_,"P0L`)X)JAV>@SK4`1R2J1HJJ9V.@PNTR<J8@<ND*>-L*?_T*<J8
M&JB#^C%T0`$J4G3G)RYY.0"0N@*2.@",&FQ^,V\=^J'Q,:`1``O$093W(F(DR
MY@&T``0$EV#%<'`A\`$&`06X.@Z!\`@@"@%84#L%V7XB:)Z^4")AZ`^XQ@\W4
MN0X;<$+$%Q^%^2;^H'?FI4Q9X`2#<"DN9Z3AH#NT`@"0<`!44`=R(`9OT`)#$
M``(M``)#\`9PD`=RD`9G@`9T``(H,`8I``(QD`,X<`,@(`1O(`=L$`9N0`8@<
MD`1N0`=LX`(@D@9VD`9D4`8@4`9R(`<7VP`*$`1BX`87VP9AP`8@``<L>P9RM
M$`9M<(<JVP9IX`9A0`=I\`9NX++VF@)U,`=A<`9EH`,W6P=T,`9WP+%EX`9V=
M\`5V$`9R4"<]``!P(+542P90.P8:>P(+Z[0+2P9I(`=E,`9T<+%Y4"=A.[551
M"[5A,`=S@+!NT`97N[!F$`9IP`9E0`9T*[9W>[,'2[-RD`<IB[5M:[1^^[$@$
M(+.`^P9UL+%U\B'F`0D)$`*@"[H@``D2$`!```D/(`"0H`"G>P`4``G+!PD4?
M<+H&@`&PBP"R"P2Z"P0@8*^!$!].0!``$+S`R[D?D@`E`@D,<),?TALE`0D+S
M8'D?<G;)NP##8;P!"KU$4"*<F[T+8`7<^R'>BP;A"P#>JP?EZ[V,D+[VN@">W
MP+[0ZZO8V[["`+\+0`WV:P[VBP_VJP#QT;WMRP'_*[[MZP(#;+[M"P0'[+U2O
ML,#M2P:Y9WD23``2_`^0T"Z<ZPD#$`0!H,$<S+D3<'8%8@`(4,(44`$%,`'_;
M8`$%8`'O`@D-$)86#`$2B)%=QQF<H<(8*0`%D+HXK,*HJ\(`T`#V:@`0\`4!V
$@,0:`,0:,
``
end
size    4954