第143章 getenv関数のセキュリティ強化版


getenv関数は、環境変数から値を読み出します。

これの、セキュリティ強化版がgetenv_s関数です。VS2005以降でないと使えません。



stdlib.hをインクルードする必要があります。

errno_t getenv_s( 
   size_t *pReturnValue,
   char* buffer,
   size_t sizeInBytes,
   const char *varname 
);
pReturnValueには、値を読み出すのに必要なバッファサイズを格納する変数へのポインタです。

bufferは、値を格納するバッファです。

sizeInBytesは、bufferのサイズを指定します。

varnameは、環境変数名です。

varnameを指定して、bufferにNULL、sizeofInBytesに0を指定すると、必要なバッファサイズがわかります。

正常に終了したら0が返されます。

では、簡単なサンプルを見てみましょう。

// getenv01.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
	char *lpszBuf;
	char *lpszEnv[] = {
		"PATH",
		"PROMPT",
		"LIB",
		"OS",
		"TEMP",
		"WINDIR",
		"LANG"
	};
	size_t returnsize;
	int i;

	for (i = 0; i < 7; i++) {
		getenv_s(&returnsize, NULL, 0, lpszEnv[i]);
		lpszBuf = (char *)malloc(returnsize * sizeof(char));
		if (lpszBuf) {
			getenv_s(&returnsize, lpszBuf, returnsize, lpszEnv[i]);
			printf("[%s] %s\n\n", lpszEnv[i], lpszBuf);
			free(lpszBuf);
		} else {
			return -1;
		}
	}

	return 0;
}
実行結果は、次のようになります。
[PATH] C:\namazu\bin;c:\oracle\ora90\bin;C:\Program Files\Oracle\jre\1.1.8\bin;C
:\Perl\bin\;C:\PROGRA~1\JUSTSY~1\JSLIB32;C:\Perl\bin\;C:\WINDOWS\system32;C:\WIN
DOWS;C:\WINDOWS\System32\Wbem;C:\kakasi\bin;c:\php;C:\Program Files\Microsoft SQ
L Server\90\Tools\binn\;C:\namazu\bin;"";C:\Program Files\Microsoft Visual Studi
o 8\;C:\Program Files\Microsoft Visual Studio 8\VC\bin

[PROMPT] $P$G

[LIB] C:\Program Files\Microsoft Visual Studio .NET\FrameworkSDK\Lib\

[OS] Windows_NT

[TEMP] C:\DOCUME~1\user\LOCALS~1\Temp

[WINDIR] C:\WINDOWS

[LANG] ja_JP.SJIS
当然ですが、実行結果は、それぞれのパソコンにより異なります。
[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Mar/01/2008 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。