TECH日記

技術の薀蓄

mkstemp() for win32

2008-01-26 09:25:47 | Weblog
仕様
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/mkstemp.3.html

実装Hint
16進数を使うのは頭いいですね
http://lists.osuosl.org/pipermail/darcs-devel/attachments/20050127/ef5b98af/
attachment.bin

GetTempFileName()関数を考えてが、フォルダー文字("\")の問題であきらめた
http://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/c603.h
tml
http://nienie.com/~masapico/api_GetTempFileName.html

乱数の初期化
自分で考えたが、同じやり方みたい
http://www9.plala.or.jp/sgwr-t/lib/srand.html

Printf
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/snprintf.3.html


ソースコード
// license free and risk free
// 自由に使っていいですが動作保障しません
int mkstemp(char *temp)
{
// 乱数を初期化(最初のみ)
static bool rand_seed_done;
if(!rand_seed_done)
{
srand((unsigned)time(NULL));
rand_seed_done = true;
}

// 空引数禁止
if(!temp) { return -1;}

// 最後6文字がXかを確認
size_t len = strlen(temp);
if(len <6 || strcmp(temp+len-6, "XXXXXX") ) // 最後6文字X以外はダメ
//errno = EINVAL;
return -1;
}

// ファイル名作成
_snprintf(temp+len-6, 2,"%02x", rand()); // 引数が定数の場合
ここでエラー
_snprintf(temp+len-4, 2,"%02x", rand());
_snprintf(temp+len-2, 2,"%02x", rand());
*(temp+len) = 0; // 念のため

return open(temp, O_CREAT | O_RDWR, 0666);
}


もう少し頑張ればちゃんとしたファイル名もつくれるけどね。まぁいいか