Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

189 lines
3.8 KiB

  1. /*++
  2. Copyright (C) 1996-2001 Microsoft Corporation
  3. Module Name:
  4. MKDIR.CPP
  5. Abstract:
  6. Creates directories
  7. History:
  8. --*/
  9. #include "precomp.h"
  10. #include "corepol.h"
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <mbstring.h>
  14. #include <tchar.h>
  15. class CTmpStrException
  16. {
  17. };
  18. class TmpStr
  19. {
  20. private:
  21. TCHAR *pString;
  22. public:
  23. TmpStr() :
  24. pString(NULL)
  25. {
  26. }
  27. ~TmpStr()
  28. {
  29. delete [] pString;
  30. }
  31. TmpStr &operator =(const TCHAR *szStr)
  32. {
  33. delete [] pString;
  34. pString = NULL;
  35. if (szStr)
  36. {
  37. pString = new TCHAR[lstrlen(szStr) + 1];
  38. if (!pString)
  39. throw CTmpStrException();
  40. lstrcpy(pString, szStr);
  41. }
  42. return *this;
  43. }
  44. operator const TCHAR *() const
  45. {
  46. return pString;
  47. }
  48. TCHAR Right(int i)
  49. {
  50. if (pString && (lstrlen(pString) >= i))
  51. {
  52. return pString[lstrlen(pString) - i];
  53. }
  54. else
  55. {
  56. return '\0';
  57. }
  58. }
  59. TmpStr &operator +=(const TCHAR ch)
  60. {
  61. if (pString)
  62. {
  63. TCHAR *tmpstr = new TCHAR[lstrlen(pString) + 2];
  64. if (!tmpstr)
  65. throw CTmpStrException();
  66. lstrcpy(tmpstr, pString);
  67. tmpstr[lstrlen(pString)] = ch;
  68. tmpstr[lstrlen(pString) + 1] = __TEXT('\0');
  69. delete [] pString;
  70. pString = tmpstr;
  71. }
  72. else
  73. {
  74. TCHAR *tmpstr = new TCHAR[2];
  75. if (!tmpstr)
  76. throw CTmpStrException();
  77. tmpstr[0] = ch;
  78. tmpstr[1] = __TEXT('\0');
  79. pString = tmpstr;
  80. }
  81. return *this;
  82. }
  83. TmpStr &operator +=(const TCHAR *sz)
  84. {
  85. if (sz && pString)
  86. {
  87. TCHAR *tmpstr = new TCHAR[lstrlen(pString) + lstrlen(sz) + 1];
  88. if (!tmpstr)
  89. throw CTmpStrException();
  90. lstrcpy(tmpstr, pString);
  91. lstrcat(tmpstr, sz);
  92. delete [] pString;
  93. pString = tmpstr;
  94. }
  95. else if (sz)
  96. {
  97. TCHAR *tmpstr = new TCHAR[lstrlen(sz) + 1];
  98. if (!tmpstr)
  99. throw CTmpStrException();
  100. lstrcpy(tmpstr, sz);
  101. pString = tmpstr;
  102. }
  103. return *this;
  104. }
  105. };
  106. BOOL POLARITY WbemCreateDirectory(const TCHAR *pszDirName)
  107. {
  108. BOOL bStat = TRUE;
  109. TCHAR *pCurrent = NULL;
  110. TCHAR *pDirName = new TCHAR[lstrlen(pszDirName) + 1];
  111. if (!pDirName)
  112. return FALSE;
  113. lstrcpy(pDirName, pszDirName);
  114. try
  115. {
  116. TmpStr szDirName;
  117. pCurrent = _tcstok(pDirName, __TEXT("\\"));
  118. szDirName = pCurrent;
  119. while (pCurrent)
  120. {
  121. if ((pCurrent[lstrlen(pCurrent)-1] != ':') && //This is "<drive>:\\"
  122. (pCurrent[0] != __TEXT('\\'))) //There is double slash in name
  123. {
  124. struct _stat stats;
  125. int dwstat = _tstat(szDirName, &stats);
  126. if ((dwstat == 0) &&
  127. !(stats.st_mode & _S_IFDIR))
  128. {
  129. bStat = FALSE;
  130. break;
  131. }
  132. else if (dwstat == -1)
  133. {
  134. DWORD dwStatus = GetLastError();
  135. if (!CreateDirectory(szDirName, 0))
  136. {
  137. bStat = FALSE;
  138. break;
  139. }
  140. }
  141. // else it exists already
  142. }
  143. szDirName += __TEXT('\\');
  144. pCurrent = _tcstok(0, __TEXT("\\"));
  145. szDirName += pCurrent;
  146. }
  147. }
  148. catch(...)
  149. {
  150. bStat = FALSE;
  151. }
  152. delete [] pDirName;
  153. return bStat;
  154. }