netmisc.c 38 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. /*
  2. * fs/cifs/netmisc.c
  3. *
  4. * Copyright (c) International Business Machines Corp., 2002
  5. * Author(s): Steve French (sfrench@us.ibm.com)
  6. *
  7. * Error mapping routines from Samba libsmb/errormap.c
  8. * Copyright (C) Andrew Tridgell 2001
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
  18. * the GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  23. */
  24. #include <linux/net.h>
  25. #include <linux/string.h>
  26. #include <linux/in.h>
  27. #include <linux/ctype.h>
  28. #include <linux/fs.h>
  29. #include <asm/div64.h>
  30. #include <asm/byteorder.h>
  31. #include <linux/inet.h>
  32. #include "cifsfs.h"
  33. #include "cifspdu.h"
  34. #include "cifsglob.h"
  35. #include "cifsproto.h"
  36. #include "smberr.h"
  37. #include "cifs_debug.h"
  38. #include "nterr.h"
  39. struct smb_to_posix_error {
  40. __u16 smb_err;
  41. int posix_code;
  42. };
  43. static const struct smb_to_posix_error mapping_table_ERRDOS[] = {
  44. {ERRbadfunc, -EINVAL},
  45. {ERRbadfile, -ENOENT},
  46. {ERRbadpath, -ENOTDIR},
  47. {ERRnofids, -EMFILE},
  48. {ERRnoaccess, -EACCES},
  49. {ERRbadfid, -EBADF},
  50. {ERRbadmcb, -EIO},
  51. {ERRnomem, -ENOMEM},
  52. {ERRbadmem, -EFAULT},
  53. {ERRbadenv, -EFAULT},
  54. {ERRbadformat, -EINVAL},
  55. {ERRbadaccess, -EACCES},
  56. {ERRbaddata, -EIO},
  57. {ERRbaddrive, -ENXIO},
  58. {ERRremcd, -EACCES},
  59. {ERRdiffdevice, -EXDEV},
  60. {ERRnofiles, -ENOENT},
  61. {ERRbadshare, -ETXTBSY},
  62. {ERRlock, -EACCES},
  63. {ERRunsup, -EINVAL},
  64. {ERRnosuchshare, -ENXIO},
  65. {ERRfilexists, -EEXIST},
  66. {ERRinvparm, -EINVAL},
  67. {ERRdiskfull, -ENOSPC},
  68. {ERRinvname, -ENOENT},
  69. {ERRinvlevel, -EOPNOTSUPP},
  70. {ERRdirnotempty, -ENOTEMPTY},
  71. {ERRnotlocked, -ENOLCK},
  72. {ERRcancelviolation, -ENOLCK},
  73. {ERRalreadyexists, -EEXIST},
  74. {ERRmoredata, -EOVERFLOW},
  75. {ERReasnotsupported, -EOPNOTSUPP},
  76. {ErrQuota, -EDQUOT},
  77. {ErrNotALink, -ENOLINK},
  78. {ERRnetlogonNotStarted, -ENOPROTOOPT},
  79. {ErrTooManyLinks, -EMLINK},
  80. {0, 0}
  81. };
  82. static const struct smb_to_posix_error mapping_table_ERRSRV[] = {
  83. {ERRerror, -EIO},
  84. {ERRbadpw, -EACCES}, /* was EPERM */
  85. {ERRbadtype, -EREMOTE},
  86. {ERRaccess, -EACCES},
  87. {ERRinvtid, -ENXIO},
  88. {ERRinvnetname, -ENXIO},
  89. {ERRinvdevice, -ENXIO},
  90. {ERRqfull, -ENOSPC},
  91. {ERRqtoobig, -ENOSPC},
  92. {ERRqeof, -EIO},
  93. {ERRinvpfid, -EBADF},
  94. {ERRsmbcmd, -EBADRQC},
  95. {ERRsrverror, -EIO},
  96. {ERRbadBID, -EIO},
  97. {ERRfilespecs, -EINVAL},
  98. {ERRbadLink, -EIO},
  99. {ERRbadpermits, -EINVAL},
  100. {ERRbadPID, -ESRCH},
  101. {ERRsetattrmode, -EINVAL},
  102. {ERRpaused, -EHOSTDOWN},
  103. {ERRmsgoff, -EHOSTDOWN},
  104. {ERRnoroom, -ENOSPC},
  105. {ERRrmuns, -EUSERS},
  106. {ERRtimeout, -ETIME},
  107. {ERRnoresource, -ENOBUFS},
  108. {ERRtoomanyuids, -EUSERS},
  109. {ERRbaduid, -EACCES},
  110. {ERRusempx, -EIO},
  111. {ERRusestd, -EIO},
  112. {ERR_NOTIFY_ENUM_DIR, -ENOBUFS},
  113. {ERRnoSuchUser, -EACCES},
  114. /* {ERRaccountexpired, -EACCES},
  115. {ERRbadclient, -EACCES},
  116. {ERRbadLogonTime, -EACCES},
  117. {ERRpasswordExpired, -EACCES},*/
  118. {ERRaccountexpired, -EKEYEXPIRED},
  119. {ERRbadclient, -EACCES},
  120. {ERRbadLogonTime, -EACCES},
  121. {ERRpasswordExpired, -EKEYEXPIRED},
  122. {ERRnosupport, -EINVAL},
  123. {0, 0}
  124. };
  125. static const struct smb_to_posix_error mapping_table_ERRHRD[] = {
  126. {0, 0}
  127. };
  128. /* if the mount helper is missing we need to reverse the 1st slash
  129. from '/' to backslash in order to format the UNC properly for
  130. ip address parsing and for tree connect (unless the user
  131. remembered to put the UNC name in properly). Fortunately we do
  132. not have to call this twice (we check for IPv4 addresses
  133. first, so it is already converted by the time we
  134. try IPv6 addresses */
  135. static int canonicalize_unc(char *cp)
  136. {
  137. int i;
  138. for (i = 0; i <= 46 /* INET6_ADDRSTRLEN */ ; i++) {
  139. if (cp[i] == 0)
  140. break;
  141. if (cp[i] == '\\')
  142. break;
  143. if (cp[i] == '/') {
  144. #ifdef CONFIG_CIFS_DEBUG2
  145. cFYI(1, ("change slash to backslash in malformed UNC"));
  146. #endif
  147. cp[i] = '\\';
  148. return 1;
  149. }
  150. }
  151. return 0;
  152. }
  153. /* Convert string containing dotted ip address to binary form */
  154. /* returns 0 if invalid address */
  155. int
  156. cifs_inet_pton(int address_family, char *cp, void *dst)
  157. {
  158. int ret = 0;
  159. /* calculate length by finding first slash or NULL */
  160. if (address_family == AF_INET) {
  161. ret = in4_pton(cp, -1 /* len */, dst, '\\', NULL);
  162. if (ret == 0) {
  163. if (canonicalize_unc(cp))
  164. ret = in4_pton(cp, -1, dst, '\\', NULL);
  165. }
  166. } else if (address_family == AF_INET6) {
  167. ret = in6_pton(cp, -1 /* len */, dst , '\\', NULL);
  168. }
  169. #ifdef CONFIG_CIFS_DEBUG2
  170. cFYI(1, ("address conversion returned %d for %s", ret, cp));
  171. #endif
  172. if (ret > 0)
  173. ret = 1;
  174. return ret;
  175. }
  176. /*****************************************************************************
  177. convert a NT status code to a dos class/code
  178. *****************************************************************************/
  179. /* NT status -> dos error map */
  180. static const struct {
  181. __u8 dos_class;
  182. __u16 dos_code;
  183. __u32 ntstatus;
  184. } ntstatus_to_dos_map[] = {
  185. {
  186. ERRDOS, ERRgeneral, NT_STATUS_UNSUCCESSFUL}, {
  187. ERRDOS, ERRbadfunc, NT_STATUS_NOT_IMPLEMENTED}, {
  188. ERRDOS, ERRinvlevel, NT_STATUS_INVALID_INFO_CLASS}, {
  189. ERRDOS, 24, NT_STATUS_INFO_LENGTH_MISMATCH}, {
  190. ERRHRD, ERRgeneral, NT_STATUS_ACCESS_VIOLATION}, {
  191. ERRHRD, ERRgeneral, NT_STATUS_IN_PAGE_ERROR}, {
  192. ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_QUOTA}, {
  193. ERRDOS, ERRbadfid, NT_STATUS_INVALID_HANDLE}, {
  194. ERRHRD, ERRgeneral, NT_STATUS_BAD_INITIAL_STACK}, {
  195. ERRDOS, 193, NT_STATUS_BAD_INITIAL_PC}, {
  196. ERRDOS, 87, NT_STATUS_INVALID_CID}, {
  197. ERRHRD, ERRgeneral, NT_STATUS_TIMER_NOT_CANCELED}, {
  198. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER}, {
  199. ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_DEVICE}, {
  200. ERRDOS, ERRbadfile, NT_STATUS_NO_SUCH_FILE}, {
  201. ERRDOS, ERRbadfunc, NT_STATUS_INVALID_DEVICE_REQUEST}, {
  202. ERRDOS, 38, NT_STATUS_END_OF_FILE}, {
  203. ERRDOS, 34, NT_STATUS_WRONG_VOLUME}, {
  204. ERRDOS, 21, NT_STATUS_NO_MEDIA_IN_DEVICE}, {
  205. ERRHRD, ERRgeneral, NT_STATUS_UNRECOGNIZED_MEDIA}, {
  206. ERRDOS, 27, NT_STATUS_NONEXISTENT_SECTOR},
  207. /* { This NT error code was 'sqashed'
  208. from NT_STATUS_MORE_PROCESSING_REQUIRED to NT_STATUS_OK
  209. during the session setup } */
  210. {
  211. ERRDOS, ERRnomem, NT_STATUS_NO_MEMORY}, {
  212. ERRDOS, 487, NT_STATUS_CONFLICTING_ADDRESSES}, {
  213. ERRDOS, 487, NT_STATUS_NOT_MAPPED_VIEW}, {
  214. ERRDOS, 87, NT_STATUS_UNABLE_TO_FREE_VM}, {
  215. ERRDOS, 87, NT_STATUS_UNABLE_TO_DELETE_SECTION}, {
  216. ERRDOS, 2142, NT_STATUS_INVALID_SYSTEM_SERVICE}, {
  217. ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_INSTRUCTION}, {
  218. ERRDOS, ERRnoaccess, NT_STATUS_INVALID_LOCK_SEQUENCE}, {
  219. ERRDOS, ERRnoaccess, NT_STATUS_INVALID_VIEW_SIZE}, {
  220. ERRDOS, 193, NT_STATUS_INVALID_FILE_FOR_SECTION}, {
  221. ERRDOS, ERRnoaccess, NT_STATUS_ALREADY_COMMITTED},
  222. /* { This NT error code was 'sqashed'
  223. from NT_STATUS_ACCESS_DENIED to NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE
  224. during the session setup } */
  225. {
  226. ERRDOS, ERRnoaccess, NT_STATUS_ACCESS_DENIED}, {
  227. ERRDOS, 111, NT_STATUS_BUFFER_TOO_SMALL}, {
  228. ERRDOS, ERRbadfid, NT_STATUS_OBJECT_TYPE_MISMATCH}, {
  229. ERRHRD, ERRgeneral, NT_STATUS_NONCONTINUABLE_EXCEPTION}, {
  230. ERRHRD, ERRgeneral, NT_STATUS_INVALID_DISPOSITION}, {
  231. ERRHRD, ERRgeneral, NT_STATUS_UNWIND}, {
  232. ERRHRD, ERRgeneral, NT_STATUS_BAD_STACK}, {
  233. ERRHRD, ERRgeneral, NT_STATUS_INVALID_UNWIND_TARGET}, {
  234. ERRDOS, 158, NT_STATUS_NOT_LOCKED}, {
  235. ERRHRD, ERRgeneral, NT_STATUS_PARITY_ERROR}, {
  236. ERRDOS, 487, NT_STATUS_UNABLE_TO_DECOMMIT_VM}, {
  237. ERRDOS, 487, NT_STATUS_NOT_COMMITTED}, {
  238. ERRHRD, ERRgeneral, NT_STATUS_INVALID_PORT_ATTRIBUTES}, {
  239. ERRHRD, ERRgeneral, NT_STATUS_PORT_MESSAGE_TOO_LONG}, {
  240. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_MIX}, {
  241. ERRHRD, ERRgeneral, NT_STATUS_INVALID_QUOTA_LOWER}, {
  242. ERRHRD, ERRgeneral, NT_STATUS_DISK_CORRUPT_ERROR}, {
  243. ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_INVALID}, { /* mapping changed since shell does lookup on * and expects file not found */
  244. ERRDOS, ERRbadfile, NT_STATUS_OBJECT_NAME_NOT_FOUND}, {
  245. ERRDOS, ERRalreadyexists, NT_STATUS_OBJECT_NAME_COLLISION}, {
  246. ERRHRD, ERRgeneral, NT_STATUS_HANDLE_NOT_WAITABLE}, {
  247. ERRDOS, ERRbadfid, NT_STATUS_PORT_DISCONNECTED}, {
  248. ERRHRD, ERRgeneral, NT_STATUS_DEVICE_ALREADY_ATTACHED}, {
  249. ERRDOS, 161, NT_STATUS_OBJECT_PATH_INVALID}, {
  250. ERRDOS, ERRbadpath, NT_STATUS_OBJECT_PATH_NOT_FOUND}, {
  251. ERRDOS, 161, NT_STATUS_OBJECT_PATH_SYNTAX_BAD}, {
  252. ERRHRD, ERRgeneral, NT_STATUS_DATA_OVERRUN}, {
  253. ERRHRD, ERRgeneral, NT_STATUS_DATA_LATE_ERROR}, {
  254. ERRDOS, 23, NT_STATUS_DATA_ERROR}, {
  255. ERRDOS, 23, NT_STATUS_CRC_ERROR}, {
  256. ERRDOS, ERRnomem, NT_STATUS_SECTION_TOO_BIG}, {
  257. ERRDOS, ERRnoaccess, NT_STATUS_PORT_CONNECTION_REFUSED}, {
  258. ERRDOS, ERRbadfid, NT_STATUS_INVALID_PORT_HANDLE}, {
  259. ERRDOS, ERRbadshare, NT_STATUS_SHARING_VIOLATION}, {
  260. ERRHRD, ERRgeneral, NT_STATUS_QUOTA_EXCEEDED}, {
  261. ERRDOS, 87, NT_STATUS_INVALID_PAGE_PROTECTION}, {
  262. ERRDOS, 288, NT_STATUS_MUTANT_NOT_OWNED}, {
  263. ERRDOS, 298, NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED}, {
  264. ERRDOS, 87, NT_STATUS_PORT_ALREADY_SET}, {
  265. ERRDOS, 87, NT_STATUS_SECTION_NOT_IMAGE}, {
  266. ERRDOS, 156, NT_STATUS_SUSPEND_COUNT_EXCEEDED}, {
  267. ERRDOS, ERRnoaccess, NT_STATUS_THREAD_IS_TERMINATING}, {
  268. ERRDOS, 87, NT_STATUS_BAD_WORKING_SET_LIMIT}, {
  269. ERRDOS, 87, NT_STATUS_INCOMPATIBLE_FILE_MAP}, {
  270. ERRDOS, 87, NT_STATUS_SECTION_PROTECTION}, {
  271. ERRDOS, ERReasnotsupported, NT_STATUS_EAS_NOT_SUPPORTED}, {
  272. ERRDOS, 255, NT_STATUS_EA_TOO_LARGE}, {
  273. ERRHRD, ERRgeneral, NT_STATUS_NONEXISTENT_EA_ENTRY}, {
  274. ERRHRD, ERRgeneral, NT_STATUS_NO_EAS_ON_FILE}, {
  275. ERRHRD, ERRgeneral, NT_STATUS_EA_CORRUPT_ERROR}, {
  276. ERRDOS, ERRlock, NT_STATUS_FILE_LOCK_CONFLICT}, {
  277. ERRDOS, ERRlock, NT_STATUS_LOCK_NOT_GRANTED}, {
  278. ERRDOS, ERRbadfile, NT_STATUS_DELETE_PENDING}, {
  279. ERRDOS, ERRunsup, NT_STATUS_CTL_FILE_NOT_SUPPORTED}, {
  280. ERRHRD, ERRgeneral, NT_STATUS_UNKNOWN_REVISION}, {
  281. ERRHRD, ERRgeneral, NT_STATUS_REVISION_MISMATCH}, {
  282. ERRHRD, ERRgeneral, NT_STATUS_INVALID_OWNER}, {
  283. ERRHRD, ERRgeneral, NT_STATUS_INVALID_PRIMARY_GROUP}, {
  284. ERRHRD, ERRgeneral, NT_STATUS_NO_IMPERSONATION_TOKEN}, {
  285. ERRHRD, ERRgeneral, NT_STATUS_CANT_DISABLE_MANDATORY}, {
  286. ERRDOS, 2215, NT_STATUS_NO_LOGON_SERVERS}, {
  287. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_LOGON_SESSION}, {
  288. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PRIVILEGE}, {
  289. ERRDOS, ERRnoaccess, NT_STATUS_PRIVILEGE_NOT_HELD}, {
  290. ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACCOUNT_NAME}, {
  291. ERRHRD, ERRgeneral, NT_STATUS_USER_EXISTS},
  292. /* { This NT error code was 'sqashed'
  293. from NT_STATUS_NO_SUCH_USER to NT_STATUS_LOGON_FAILURE
  294. during the session setup } */
  295. {
  296. ERRDOS, ERRnoaccess, NT_STATUS_NO_SUCH_USER}, { /* could map to 2238 */
  297. ERRHRD, ERRgeneral, NT_STATUS_GROUP_EXISTS}, {
  298. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_GROUP}, {
  299. ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_GROUP}, {
  300. ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_GROUP}, {
  301. ERRHRD, ERRgeneral, NT_STATUS_LAST_ADMIN},
  302. /* { This NT error code was 'sqashed'
  303. from NT_STATUS_WRONG_PASSWORD to NT_STATUS_LOGON_FAILURE
  304. during the session setup } */
  305. {
  306. ERRSRV, ERRbadpw, NT_STATUS_WRONG_PASSWORD}, {
  307. ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_PASSWORD}, {
  308. ERRHRD, ERRgeneral, NT_STATUS_PASSWORD_RESTRICTION}, {
  309. ERRDOS, ERRnoaccess, NT_STATUS_LOGON_FAILURE}, {
  310. ERRHRD, ERRgeneral, NT_STATUS_ACCOUNT_RESTRICTION}, {
  311. ERRSRV, ERRbadLogonTime, NT_STATUS_INVALID_LOGON_HOURS}, {
  312. ERRSRV, ERRbadclient, NT_STATUS_INVALID_WORKSTATION}, {
  313. ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_EXPIRED}, {
  314. ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_DISABLED}, {
  315. ERRHRD, ERRgeneral, NT_STATUS_NONE_MAPPED}, {
  316. ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_LUIDS_REQUESTED}, {
  317. ERRHRD, ERRgeneral, NT_STATUS_LUIDS_EXHAUSTED}, {
  318. ERRHRD, ERRgeneral, NT_STATUS_INVALID_SUB_AUTHORITY}, {
  319. ERRHRD, ERRgeneral, NT_STATUS_INVALID_ACL}, {
  320. ERRHRD, ERRgeneral, NT_STATUS_INVALID_SID}, {
  321. ERRHRD, ERRgeneral, NT_STATUS_INVALID_SECURITY_DESCR}, {
  322. ERRDOS, 127, NT_STATUS_PROCEDURE_NOT_FOUND}, {
  323. ERRDOS, 193, NT_STATUS_INVALID_IMAGE_FORMAT}, {
  324. ERRHRD, ERRgeneral, NT_STATUS_NO_TOKEN}, {
  325. ERRHRD, ERRgeneral, NT_STATUS_BAD_INHERITANCE_ACL}, {
  326. ERRDOS, 158, NT_STATUS_RANGE_NOT_LOCKED}, {
  327. ERRDOS, 112, NT_STATUS_DISK_FULL}, {
  328. ERRHRD, ERRgeneral, NT_STATUS_SERVER_DISABLED}, {
  329. ERRHRD, ERRgeneral, NT_STATUS_SERVER_NOT_DISABLED}, {
  330. ERRDOS, 68, NT_STATUS_TOO_MANY_GUIDS_REQUESTED}, {
  331. ERRDOS, 259, NT_STATUS_GUIDS_EXHAUSTED}, {
  332. ERRHRD, ERRgeneral, NT_STATUS_INVALID_ID_AUTHORITY}, {
  333. ERRDOS, 259, NT_STATUS_AGENTS_EXHAUSTED}, {
  334. ERRDOS, 154, NT_STATUS_INVALID_VOLUME_LABEL}, {
  335. ERRDOS, 14, NT_STATUS_SECTION_NOT_EXTENDED}, {
  336. ERRDOS, 487, NT_STATUS_NOT_MAPPED_DATA}, {
  337. ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_DATA_NOT_FOUND}, {
  338. ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_TYPE_NOT_FOUND}, {
  339. ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_NAME_NOT_FOUND}, {
  340. ERRHRD, ERRgeneral, NT_STATUS_ARRAY_BOUNDS_EXCEEDED}, {
  341. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_DENORMAL_OPERAND}, {
  342. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_DIVIDE_BY_ZERO}, {
  343. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_INEXACT_RESULT}, {
  344. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_INVALID_OPERATION}, {
  345. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_OVERFLOW}, {
  346. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_STACK_CHECK}, {
  347. ERRHRD, ERRgeneral, NT_STATUS_FLOAT_UNDERFLOW}, {
  348. ERRHRD, ERRgeneral, NT_STATUS_INTEGER_DIVIDE_BY_ZERO}, {
  349. ERRDOS, 534, NT_STATUS_INTEGER_OVERFLOW}, {
  350. ERRHRD, ERRgeneral, NT_STATUS_PRIVILEGED_INSTRUCTION}, {
  351. ERRDOS, ERRnomem, NT_STATUS_TOO_MANY_PAGING_FILES}, {
  352. ERRHRD, ERRgeneral, NT_STATUS_FILE_INVALID}, {
  353. ERRHRD, ERRgeneral, NT_STATUS_ALLOTTED_SPACE_EXCEEDED},
  354. /* { This NT error code was 'sqashed'
  355. from NT_STATUS_INSUFFICIENT_RESOURCES to
  356. NT_STATUS_INSUFF_SERVER_RESOURCES during the session setup } */
  357. {
  358. ERRDOS, ERRnomem, NT_STATUS_INSUFFICIENT_RESOURCES}, {
  359. ERRDOS, ERRbadpath, NT_STATUS_DFS_EXIT_PATH_FOUND}, {
  360. ERRDOS, 23, NT_STATUS_DEVICE_DATA_ERROR}, {
  361. ERRHRD, ERRgeneral, NT_STATUS_DEVICE_NOT_CONNECTED}, {
  362. ERRDOS, 21, NT_STATUS_DEVICE_POWER_FAILURE}, {
  363. ERRDOS, 487, NT_STATUS_FREE_VM_NOT_AT_BASE}, {
  364. ERRDOS, 487, NT_STATUS_MEMORY_NOT_ALLOCATED}, {
  365. ERRHRD, ERRgeneral, NT_STATUS_WORKING_SET_QUOTA}, {
  366. ERRDOS, 19, NT_STATUS_MEDIA_WRITE_PROTECTED}, {
  367. ERRDOS, 21, NT_STATUS_DEVICE_NOT_READY}, {
  368. ERRHRD, ERRgeneral, NT_STATUS_INVALID_GROUP_ATTRIBUTES}, {
  369. ERRHRD, ERRgeneral, NT_STATUS_BAD_IMPERSONATION_LEVEL}, {
  370. ERRHRD, ERRgeneral, NT_STATUS_CANT_OPEN_ANONYMOUS}, {
  371. ERRHRD, ERRgeneral, NT_STATUS_BAD_VALIDATION_CLASS}, {
  372. ERRHRD, ERRgeneral, NT_STATUS_BAD_TOKEN_TYPE}, {
  373. ERRDOS, 87, NT_STATUS_BAD_MASTER_BOOT_RECORD}, {
  374. ERRHRD, ERRgeneral, NT_STATUS_INSTRUCTION_MISALIGNMENT}, {
  375. ERRDOS, ERRpipebusy, NT_STATUS_INSTANCE_NOT_AVAILABLE}, {
  376. ERRDOS, ERRpipebusy, NT_STATUS_PIPE_NOT_AVAILABLE}, {
  377. ERRDOS, ERRbadpipe, NT_STATUS_INVALID_PIPE_STATE}, {
  378. ERRDOS, ERRpipebusy, NT_STATUS_PIPE_BUSY}, {
  379. ERRDOS, ERRbadfunc, NT_STATUS_ILLEGAL_FUNCTION}, {
  380. ERRDOS, ERRnotconnected, NT_STATUS_PIPE_DISCONNECTED}, {
  381. ERRDOS, ERRpipeclosing, NT_STATUS_PIPE_CLOSING}, {
  382. ERRHRD, ERRgeneral, NT_STATUS_PIPE_CONNECTED}, {
  383. ERRHRD, ERRgeneral, NT_STATUS_PIPE_LISTENING}, {
  384. ERRDOS, ERRbadpipe, NT_STATUS_INVALID_READ_MODE}, {
  385. ERRDOS, 121, NT_STATUS_IO_TIMEOUT}, {
  386. ERRDOS, 38, NT_STATUS_FILE_FORCED_CLOSED}, {
  387. ERRHRD, ERRgeneral, NT_STATUS_PROFILING_NOT_STARTED}, {
  388. ERRHRD, ERRgeneral, NT_STATUS_PROFILING_NOT_STOPPED}, {
  389. ERRHRD, ERRgeneral, NT_STATUS_COULD_NOT_INTERPRET}, {
  390. ERRDOS, ERRnoaccess, NT_STATUS_FILE_IS_A_DIRECTORY}, {
  391. ERRDOS, ERRunsup, NT_STATUS_NOT_SUPPORTED}, {
  392. ERRDOS, 51, NT_STATUS_REMOTE_NOT_LISTENING}, {
  393. ERRDOS, 52, NT_STATUS_DUPLICATE_NAME}, {
  394. ERRDOS, 53, NT_STATUS_BAD_NETWORK_PATH}, {
  395. ERRDOS, 54, NT_STATUS_NETWORK_BUSY}, {
  396. ERRDOS, 55, NT_STATUS_DEVICE_DOES_NOT_EXIST}, {
  397. ERRDOS, 56, NT_STATUS_TOO_MANY_COMMANDS}, {
  398. ERRDOS, 57, NT_STATUS_ADAPTER_HARDWARE_ERROR}, {
  399. ERRDOS, 58, NT_STATUS_INVALID_NETWORK_RESPONSE}, {
  400. ERRDOS, 59, NT_STATUS_UNEXPECTED_NETWORK_ERROR}, {
  401. ERRDOS, 60, NT_STATUS_BAD_REMOTE_ADAPTER}, {
  402. ERRDOS, 61, NT_STATUS_PRINT_QUEUE_FULL}, {
  403. ERRDOS, 62, NT_STATUS_NO_SPOOL_SPACE}, {
  404. ERRDOS, 63, NT_STATUS_PRINT_CANCELLED}, {
  405. ERRDOS, 64, NT_STATUS_NETWORK_NAME_DELETED}, {
  406. ERRDOS, 65, NT_STATUS_NETWORK_ACCESS_DENIED}, {
  407. ERRDOS, 66, NT_STATUS_BAD_DEVICE_TYPE}, {
  408. ERRDOS, ERRnosuchshare, NT_STATUS_BAD_NETWORK_NAME}, {
  409. ERRDOS, 68, NT_STATUS_TOO_MANY_NAMES}, {
  410. ERRDOS, 69, NT_STATUS_TOO_MANY_SESSIONS}, {
  411. ERRDOS, 70, NT_STATUS_SHARING_PAUSED}, {
  412. ERRDOS, 71, NT_STATUS_REQUEST_NOT_ACCEPTED}, {
  413. ERRDOS, 72, NT_STATUS_REDIRECTOR_PAUSED}, {
  414. ERRDOS, 88, NT_STATUS_NET_WRITE_FAULT}, {
  415. ERRHRD, ERRgeneral, NT_STATUS_PROFILING_AT_LIMIT}, {
  416. ERRDOS, ERRdiffdevice, NT_STATUS_NOT_SAME_DEVICE}, {
  417. ERRDOS, ERRnoaccess, NT_STATUS_FILE_RENAMED}, {
  418. ERRDOS, 240, NT_STATUS_VIRTUAL_CIRCUIT_CLOSED}, {
  419. ERRHRD, ERRgeneral, NT_STATUS_NO_SECURITY_ON_OBJECT}, {
  420. ERRHRD, ERRgeneral, NT_STATUS_CANT_WAIT}, {
  421. ERRDOS, ERRpipeclosing, NT_STATUS_PIPE_EMPTY}, {
  422. ERRHRD, ERRgeneral, NT_STATUS_CANT_ACCESS_DOMAIN_INFO}, {
  423. ERRHRD, ERRgeneral, NT_STATUS_CANT_TERMINATE_SELF}, {
  424. ERRHRD, ERRgeneral, NT_STATUS_INVALID_SERVER_STATE}, {
  425. ERRHRD, ERRgeneral, NT_STATUS_INVALID_DOMAIN_STATE}, {
  426. ERRHRD, ERRgeneral, NT_STATUS_INVALID_DOMAIN_ROLE}, {
  427. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_DOMAIN}, {
  428. ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_EXISTS}, {
  429. ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_LIMIT_EXCEEDED}, {
  430. ERRDOS, 300, NT_STATUS_OPLOCK_NOT_GRANTED}, {
  431. ERRDOS, 301, NT_STATUS_INVALID_OPLOCK_PROTOCOL}, {
  432. ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_DB_CORRUPTION}, {
  433. ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_ERROR}, {
  434. ERRHRD, ERRgeneral, NT_STATUS_GENERIC_NOT_MAPPED}, {
  435. ERRHRD, ERRgeneral, NT_STATUS_BAD_DESCRIPTOR_FORMAT}, {
  436. ERRHRD, ERRgeneral, NT_STATUS_INVALID_USER_BUFFER}, {
  437. ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_IO_ERROR}, {
  438. ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_CREATE_ERR}, {
  439. ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_MAP_ERROR}, {
  440. ERRHRD, ERRgeneral, NT_STATUS_UNEXPECTED_MM_EXTEND_ERR}, {
  441. ERRHRD, ERRgeneral, NT_STATUS_NOT_LOGON_PROCESS}, {
  442. ERRHRD, ERRgeneral, NT_STATUS_LOGON_SESSION_EXISTS}, {
  443. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_1}, {
  444. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_2}, {
  445. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_3}, {
  446. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_4}, {
  447. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_5}, {
  448. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_6}, {
  449. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_7}, {
  450. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_8}, {
  451. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_9}, {
  452. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_10}, {
  453. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_11}, {
  454. ERRDOS, 87, NT_STATUS_INVALID_PARAMETER_12}, {
  455. ERRDOS, ERRbadpath, NT_STATUS_REDIRECTOR_NOT_STARTED}, {
  456. ERRHRD, ERRgeneral, NT_STATUS_REDIRECTOR_STARTED}, {
  457. ERRHRD, ERRgeneral, NT_STATUS_STACK_OVERFLOW}, {
  458. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_PACKAGE}, {
  459. ERRHRD, ERRgeneral, NT_STATUS_BAD_FUNCTION_TABLE}, {
  460. ERRDOS, 203, 0xc0000100}, {
  461. ERRDOS, 145, NT_STATUS_DIRECTORY_NOT_EMPTY}, {
  462. ERRHRD, ERRgeneral, NT_STATUS_FILE_CORRUPT_ERROR}, {
  463. ERRDOS, 267, NT_STATUS_NOT_A_DIRECTORY}, {
  464. ERRHRD, ERRgeneral, NT_STATUS_BAD_LOGON_SESSION_STATE}, {
  465. ERRHRD, ERRgeneral, NT_STATUS_LOGON_SESSION_COLLISION}, {
  466. ERRDOS, 206, NT_STATUS_NAME_TOO_LONG}, {
  467. ERRDOS, 2401, NT_STATUS_FILES_OPEN}, {
  468. ERRDOS, 2404, NT_STATUS_CONNECTION_IN_USE}, {
  469. ERRHRD, ERRgeneral, NT_STATUS_MESSAGE_NOT_FOUND}, {
  470. ERRDOS, ERRnoaccess, NT_STATUS_PROCESS_IS_TERMINATING}, {
  471. ERRHRD, ERRgeneral, NT_STATUS_INVALID_LOGON_TYPE}, {
  472. ERRHRD, ERRgeneral, NT_STATUS_NO_GUID_TRANSLATION}, {
  473. ERRHRD, ERRgeneral, NT_STATUS_CANNOT_IMPERSONATE}, {
  474. ERRHRD, ERRgeneral, NT_STATUS_IMAGE_ALREADY_LOADED}, {
  475. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_NOT_PRESENT}, {
  476. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_LID_NOT_EXIST}, {
  477. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_LID_ALREADY_OWNED}, {
  478. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_NOT_LID_OWNER}, {
  479. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_COMMAND}, {
  480. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_LID}, {
  481. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE}, {
  482. ERRHRD, ERRgeneral, NT_STATUS_ABIOS_INVALID_SELECTOR}, {
  483. ERRHRD, ERRgeneral, NT_STATUS_NO_LDT}, {
  484. ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_SIZE}, {
  485. ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_OFFSET}, {
  486. ERRHRD, ERRgeneral, NT_STATUS_INVALID_LDT_DESCRIPTOR}, {
  487. ERRDOS, 193, NT_STATUS_INVALID_IMAGE_NE_FORMAT}, {
  488. ERRHRD, ERRgeneral, NT_STATUS_RXACT_INVALID_STATE}, {
  489. ERRHRD, ERRgeneral, NT_STATUS_RXACT_COMMIT_FAILURE}, {
  490. ERRHRD, ERRgeneral, NT_STATUS_MAPPED_FILE_SIZE_ZERO}, {
  491. ERRDOS, ERRnofids, NT_STATUS_TOO_MANY_OPENED_FILES}, {
  492. ERRHRD, ERRgeneral, NT_STATUS_CANCELLED}, {
  493. ERRDOS, ERRnoaccess, NT_STATUS_CANNOT_DELETE}, {
  494. ERRHRD, ERRgeneral, NT_STATUS_INVALID_COMPUTER_NAME}, {
  495. ERRDOS, ERRnoaccess, NT_STATUS_FILE_DELETED}, {
  496. ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_ACCOUNT}, {
  497. ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_GROUP}, {
  498. ERRHRD, ERRgeneral, NT_STATUS_SPECIAL_USER}, {
  499. ERRHRD, ERRgeneral, NT_STATUS_MEMBERS_PRIMARY_GROUP}, {
  500. ERRDOS, ERRbadfid, NT_STATUS_FILE_CLOSED}, {
  501. ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_THREADS}, {
  502. ERRHRD, ERRgeneral, NT_STATUS_THREAD_NOT_IN_PROCESS}, {
  503. ERRHRD, ERRgeneral, NT_STATUS_TOKEN_ALREADY_IN_USE}, {
  504. ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_QUOTA_EXCEEDED}, {
  505. ERRHRD, ERRgeneral, NT_STATUS_COMMITMENT_LIMIT}, {
  506. ERRDOS, 193, NT_STATUS_INVALID_IMAGE_LE_FORMAT}, {
  507. ERRDOS, 193, NT_STATUS_INVALID_IMAGE_NOT_MZ}, {
  508. ERRDOS, 193, NT_STATUS_INVALID_IMAGE_PROTECT}, {
  509. ERRDOS, 193, NT_STATUS_INVALID_IMAGE_WIN_16}, {
  510. ERRHRD, ERRgeneral, NT_STATUS_LOGON_SERVER_CONFLICT}, {
  511. ERRHRD, ERRgeneral, NT_STATUS_TIME_DIFFERENCE_AT_DC}, {
  512. ERRHRD, ERRgeneral, NT_STATUS_SYNCHRONIZATION_REQUIRED}, {
  513. ERRDOS, 126, NT_STATUS_DLL_NOT_FOUND}, {
  514. ERRHRD, ERRgeneral, NT_STATUS_OPEN_FAILED}, {
  515. ERRHRD, ERRgeneral, NT_STATUS_IO_PRIVILEGE_FAILED}, {
  516. ERRDOS, 182, NT_STATUS_ORDINAL_NOT_FOUND}, {
  517. ERRDOS, 127, NT_STATUS_ENTRYPOINT_NOT_FOUND}, {
  518. ERRHRD, ERRgeneral, NT_STATUS_CONTROL_C_EXIT}, {
  519. ERRDOS, 64, NT_STATUS_LOCAL_DISCONNECT}, {
  520. ERRDOS, 64, NT_STATUS_REMOTE_DISCONNECT}, {
  521. ERRDOS, 51, NT_STATUS_REMOTE_RESOURCES}, {
  522. ERRDOS, 59, NT_STATUS_LINK_FAILED}, {
  523. ERRDOS, 59, NT_STATUS_LINK_TIMEOUT}, {
  524. ERRDOS, 59, NT_STATUS_INVALID_CONNECTION}, {
  525. ERRDOS, 59, NT_STATUS_INVALID_ADDRESS}, {
  526. ERRHRD, ERRgeneral, NT_STATUS_DLL_INIT_FAILED}, {
  527. ERRHRD, ERRgeneral, NT_STATUS_MISSING_SYSTEMFILE}, {
  528. ERRHRD, ERRgeneral, NT_STATUS_UNHANDLED_EXCEPTION}, {
  529. ERRHRD, ERRgeneral, NT_STATUS_APP_INIT_FAILURE}, {
  530. ERRHRD, ERRgeneral, NT_STATUS_PAGEFILE_CREATE_FAILED}, {
  531. ERRHRD, ERRgeneral, NT_STATUS_NO_PAGEFILE}, {
  532. ERRDOS, 124, NT_STATUS_INVALID_LEVEL}, {
  533. ERRDOS, 86, NT_STATUS_WRONG_PASSWORD_CORE}, {
  534. ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_FLOAT_CONTEXT}, {
  535. ERRDOS, 109, NT_STATUS_PIPE_BROKEN}, {
  536. ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_CORRUPT}, {
  537. ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_IO_FAILED}, {
  538. ERRHRD, ERRgeneral, NT_STATUS_NO_EVENT_PAIR}, {
  539. ERRHRD, ERRgeneral, NT_STATUS_UNRECOGNIZED_VOLUME}, {
  540. ERRHRD, ERRgeneral, NT_STATUS_SERIAL_NO_DEVICE_INITED}, {
  541. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_ALIAS}, {
  542. ERRHRD, ERRgeneral, NT_STATUS_MEMBER_NOT_IN_ALIAS}, {
  543. ERRHRD, ERRgeneral, NT_STATUS_MEMBER_IN_ALIAS}, {
  544. ERRHRD, ERRgeneral, NT_STATUS_ALIAS_EXISTS}, {
  545. ERRHRD, ERRgeneral, NT_STATUS_LOGON_NOT_GRANTED}, {
  546. ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_SECRETS}, {
  547. ERRHRD, ERRgeneral, NT_STATUS_SECRET_TOO_LONG}, {
  548. ERRHRD, ERRgeneral, NT_STATUS_INTERNAL_DB_ERROR}, {
  549. ERRHRD, ERRgeneral, NT_STATUS_FULLSCREEN_MODE}, {
  550. ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_CONTEXT_IDS}, {
  551. ERRDOS, ERRnoaccess, NT_STATUS_LOGON_TYPE_NOT_GRANTED}, {
  552. ERRHRD, ERRgeneral, NT_STATUS_NOT_REGISTRY_FILE}, {
  553. ERRHRD, ERRgeneral, NT_STATUS_NT_CROSS_ENCRYPTION_REQUIRED}, {
  554. ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_CTRLR_CONFIG_ERROR}, {
  555. ERRHRD, ERRgeneral, NT_STATUS_FT_MISSING_MEMBER}, {
  556. ERRHRD, ERRgeneral, NT_STATUS_ILL_FORMED_SERVICE_ENTRY}, {
  557. ERRHRD, ERRgeneral, NT_STATUS_ILLEGAL_CHARACTER}, {
  558. ERRHRD, ERRgeneral, NT_STATUS_UNMAPPABLE_CHARACTER}, {
  559. ERRHRD, ERRgeneral, NT_STATUS_UNDEFINED_CHARACTER}, {
  560. ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_VOLUME}, {
  561. ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_ID_MARK_NOT_FOUND}, {
  562. ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_WRONG_CYLINDER}, {
  563. ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_UNKNOWN_ERROR}, {
  564. ERRHRD, ERRgeneral, NT_STATUS_FLOPPY_BAD_REGISTERS}, {
  565. ERRHRD, ERRgeneral, NT_STATUS_DISK_RECALIBRATE_FAILED}, {
  566. ERRHRD, ERRgeneral, NT_STATUS_DISK_OPERATION_FAILED}, {
  567. ERRHRD, ERRgeneral, NT_STATUS_DISK_RESET_FAILED}, {
  568. ERRHRD, ERRgeneral, NT_STATUS_SHARED_IRQ_BUSY}, {
  569. ERRHRD, ERRgeneral, NT_STATUS_FT_ORPHANING}, {
  570. ERRHRD, ERRgeneral, 0xc000016e}, {
  571. ERRHRD, ERRgeneral, 0xc000016f}, {
  572. ERRHRD, ERRgeneral, 0xc0000170}, {
  573. ERRHRD, ERRgeneral, 0xc0000171}, {
  574. ERRHRD, ERRgeneral, NT_STATUS_PARTITION_FAILURE}, {
  575. ERRHRD, ERRgeneral, NT_STATUS_INVALID_BLOCK_LENGTH}, {
  576. ERRHRD, ERRgeneral, NT_STATUS_DEVICE_NOT_PARTITIONED}, {
  577. ERRHRD, ERRgeneral, NT_STATUS_UNABLE_TO_LOCK_MEDIA}, {
  578. ERRHRD, ERRgeneral, NT_STATUS_UNABLE_TO_UNLOAD_MEDIA}, {
  579. ERRHRD, ERRgeneral, NT_STATUS_EOM_OVERFLOW}, {
  580. ERRHRD, ERRgeneral, NT_STATUS_NO_MEDIA}, {
  581. ERRHRD, ERRgeneral, 0xc0000179}, {
  582. ERRHRD, ERRgeneral, NT_STATUS_NO_SUCH_MEMBER}, {
  583. ERRHRD, ERRgeneral, NT_STATUS_INVALID_MEMBER}, {
  584. ERRHRD, ERRgeneral, NT_STATUS_KEY_DELETED}, {
  585. ERRHRD, ERRgeneral, NT_STATUS_NO_LOG_SPACE}, {
  586. ERRHRD, ERRgeneral, NT_STATUS_TOO_MANY_SIDS}, {
  587. ERRHRD, ERRgeneral, NT_STATUS_LM_CROSS_ENCRYPTION_REQUIRED}, {
  588. ERRHRD, ERRgeneral, NT_STATUS_KEY_HAS_CHILDREN}, {
  589. ERRHRD, ERRgeneral, NT_STATUS_CHILD_MUST_BE_VOLATILE}, {
  590. ERRDOS, 87, NT_STATUS_DEVICE_CONFIGURATION_ERROR}, {
  591. ERRHRD, ERRgeneral, NT_STATUS_DRIVER_INTERNAL_ERROR}, {
  592. ERRDOS, 22, NT_STATUS_INVALID_DEVICE_STATE}, {
  593. ERRHRD, ERRgeneral, NT_STATUS_IO_DEVICE_ERROR}, {
  594. ERRHRD, ERRgeneral, NT_STATUS_DEVICE_PROTOCOL_ERROR}, {
  595. ERRHRD, ERRgeneral, NT_STATUS_BACKUP_CONTROLLER}, {
  596. ERRHRD, ERRgeneral, NT_STATUS_LOG_FILE_FULL}, {
  597. ERRDOS, 19, NT_STATUS_TOO_LATE}, {
  598. ERRDOS, ERRnoaccess, NT_STATUS_NO_TRUST_LSA_SECRET},
  599. /* { This NT error code was 'sqashed'
  600. from NT_STATUS_NO_TRUST_SAM_ACCOUNT to
  601. NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE during the session setup } */
  602. {
  603. ERRDOS, ERRnoaccess, NT_STATUS_NO_TRUST_SAM_ACCOUNT}, {
  604. ERRDOS, ERRnoaccess, NT_STATUS_TRUSTED_DOMAIN_FAILURE}, {
  605. ERRDOS, ERRnoaccess, NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE}, {
  606. ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_FILE_CORRUPT}, {
  607. ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_CANT_START}, {
  608. ERRDOS, ERRnoaccess, NT_STATUS_TRUST_FAILURE}, {
  609. ERRHRD, ERRgeneral, NT_STATUS_MUTANT_LIMIT_EXCEEDED}, {
  610. ERRDOS, ERRnetlogonNotStarted, NT_STATUS_NETLOGON_NOT_STARTED}, {
  611. ERRSRV, ERRaccountexpired, NT_STATUS_ACCOUNT_EXPIRED}, {
  612. ERRHRD, ERRgeneral, NT_STATUS_POSSIBLE_DEADLOCK}, {
  613. ERRHRD, ERRgeneral, NT_STATUS_NETWORK_CREDENTIAL_CONFLICT}, {
  614. ERRHRD, ERRgeneral, NT_STATUS_REMOTE_SESSION_LIMIT}, {
  615. ERRHRD, ERRgeneral, NT_STATUS_EVENTLOG_FILE_CHANGED}, {
  616. ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT}, {
  617. ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT}, {
  618. ERRDOS, ERRnoaccess, NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT},
  619. /* { This NT error code was 'sqashed'
  620. from NT_STATUS_DOMAIN_TRUST_INCONSISTENT to NT_STATUS_LOGON_FAILURE
  621. during the session setup } */
  622. {
  623. ERRDOS, ERRnoaccess, NT_STATUS_DOMAIN_TRUST_INCONSISTENT}, {
  624. ERRHRD, ERRgeneral, NT_STATUS_FS_DRIVER_REQUIRED}, {
  625. ERRHRD, ERRgeneral, NT_STATUS_NO_USER_SESSION_KEY}, {
  626. ERRDOS, 59, NT_STATUS_USER_SESSION_DELETED}, {
  627. ERRHRD, ERRgeneral, NT_STATUS_RESOURCE_LANG_NOT_FOUND}, {
  628. ERRDOS, ERRnomem, NT_STATUS_INSUFF_SERVER_RESOURCES}, {
  629. ERRHRD, ERRgeneral, NT_STATUS_INVALID_BUFFER_SIZE}, {
  630. ERRHRD, ERRgeneral, NT_STATUS_INVALID_ADDRESS_COMPONENT}, {
  631. ERRHRD, ERRgeneral, NT_STATUS_INVALID_ADDRESS_WILDCARD}, {
  632. ERRDOS, 68, NT_STATUS_TOO_MANY_ADDRESSES}, {
  633. ERRDOS, 52, NT_STATUS_ADDRESS_ALREADY_EXISTS}, {
  634. ERRDOS, 64, NT_STATUS_ADDRESS_CLOSED}, {
  635. ERRDOS, 64, NT_STATUS_CONNECTION_DISCONNECTED}, {
  636. ERRDOS, 64, NT_STATUS_CONNECTION_RESET}, {
  637. ERRDOS, 68, NT_STATUS_TOO_MANY_NODES}, {
  638. ERRDOS, 59, NT_STATUS_TRANSACTION_ABORTED}, {
  639. ERRDOS, 59, NT_STATUS_TRANSACTION_TIMED_OUT}, {
  640. ERRDOS, 59, NT_STATUS_TRANSACTION_NO_RELEASE}, {
  641. ERRDOS, 59, NT_STATUS_TRANSACTION_NO_MATCH}, {
  642. ERRDOS, 59, NT_STATUS_TRANSACTION_RESPONDED}, {
  643. ERRDOS, 59, NT_STATUS_TRANSACTION_INVALID_ID}, {
  644. ERRDOS, 59, NT_STATUS_TRANSACTION_INVALID_TYPE}, {
  645. ERRDOS, ERRunsup, NT_STATUS_NOT_SERVER_SESSION}, {
  646. ERRDOS, ERRunsup, NT_STATUS_NOT_CLIENT_SESSION}, {
  647. ERRHRD, ERRgeneral, NT_STATUS_CANNOT_LOAD_REGISTRY_FILE}, {
  648. ERRHRD, ERRgeneral, NT_STATUS_DEBUG_ATTACH_FAILED}, {
  649. ERRHRD, ERRgeneral, NT_STATUS_SYSTEM_PROCESS_TERMINATED}, {
  650. ERRHRD, ERRgeneral, NT_STATUS_DATA_NOT_ACCEPTED}, {
  651. ERRHRD, ERRgeneral, NT_STATUS_NO_BROWSER_SERVERS_FOUND}, {
  652. ERRHRD, ERRgeneral, NT_STATUS_VDM_HARD_ERROR}, {
  653. ERRHRD, ERRgeneral, NT_STATUS_DRIVER_CANCEL_TIMEOUT}, {
  654. ERRHRD, ERRgeneral, NT_STATUS_REPLY_MESSAGE_MISMATCH}, {
  655. ERRHRD, ERRgeneral, NT_STATUS_MAPPED_ALIGNMENT}, {
  656. ERRDOS, 193, NT_STATUS_IMAGE_CHECKSUM_MISMATCH}, {
  657. ERRHRD, ERRgeneral, NT_STATUS_LOST_WRITEBEHIND_DATA}, {
  658. ERRHRD, ERRgeneral, NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID}, {
  659. ERRSRV, ERRpasswordExpired, NT_STATUS_PASSWORD_MUST_CHANGE}, {
  660. ERRHRD, ERRgeneral, NT_STATUS_NOT_FOUND}, {
  661. ERRHRD, ERRgeneral, NT_STATUS_NOT_TINY_STREAM}, {
  662. ERRHRD, ERRgeneral, NT_STATUS_RECOVERY_FAILURE}, {
  663. ERRHRD, ERRgeneral, NT_STATUS_STACK_OVERFLOW_READ}, {
  664. ERRHRD, ERRgeneral, NT_STATUS_FAIL_CHECK}, {
  665. ERRHRD, ERRgeneral, NT_STATUS_DUPLICATE_OBJECTID}, {
  666. ERRHRD, ERRgeneral, NT_STATUS_OBJECTID_EXISTS}, {
  667. ERRHRD, ERRgeneral, NT_STATUS_CONVERT_TO_LARGE}, {
  668. ERRHRD, ERRgeneral, NT_STATUS_RETRY}, {
  669. ERRHRD, ERRgeneral, NT_STATUS_FOUND_OUT_OF_SCOPE}, {
  670. ERRHRD, ERRgeneral, NT_STATUS_ALLOCATE_BUCKET}, {
  671. ERRHRD, ERRgeneral, NT_STATUS_PROPSET_NOT_FOUND}, {
  672. ERRHRD, ERRgeneral, NT_STATUS_MARSHALL_OVERFLOW}, {
  673. ERRHRD, ERRgeneral, NT_STATUS_INVALID_VARIANT}, {
  674. ERRHRD, ERRgeneral, NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND}, {
  675. ERRDOS, ERRnoaccess, NT_STATUS_ACCOUNT_LOCKED_OUT}, {
  676. ERRDOS, ERRbadfid, NT_STATUS_HANDLE_NOT_CLOSABLE}, {
  677. ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_REFUSED}, {
  678. ERRHRD, ERRgeneral, NT_STATUS_GRACEFUL_DISCONNECT}, {
  679. ERRHRD, ERRgeneral, NT_STATUS_ADDRESS_ALREADY_ASSOCIATED}, {
  680. ERRHRD, ERRgeneral, NT_STATUS_ADDRESS_NOT_ASSOCIATED}, {
  681. ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_INVALID}, {
  682. ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ACTIVE}, {
  683. ERRHRD, ERRgeneral, NT_STATUS_NETWORK_UNREACHABLE}, {
  684. ERRHRD, ERRgeneral, NT_STATUS_HOST_UNREACHABLE}, {
  685. ERRHRD, ERRgeneral, NT_STATUS_PROTOCOL_UNREACHABLE}, {
  686. ERRHRD, ERRgeneral, NT_STATUS_PORT_UNREACHABLE}, {
  687. ERRHRD, ERRgeneral, NT_STATUS_REQUEST_ABORTED}, {
  688. ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_ABORTED}, {
  689. ERRHRD, ERRgeneral, NT_STATUS_BAD_COMPRESSION_BUFFER}, {
  690. ERRHRD, ERRgeneral, NT_STATUS_USER_MAPPED_FILE}, {
  691. ERRHRD, ERRgeneral, NT_STATUS_AUDIT_FAILED}, {
  692. ERRHRD, ERRgeneral, NT_STATUS_TIMER_RESOLUTION_NOT_SET}, {
  693. ERRHRD, ERRgeneral, NT_STATUS_CONNECTION_COUNT_LIMIT}, {
  694. ERRHRD, ERRgeneral, NT_STATUS_LOGIN_TIME_RESTRICTION}, {
  695. ERRHRD, ERRgeneral, NT_STATUS_LOGIN_WKSTA_RESTRICTION}, {
  696. ERRDOS, 193, NT_STATUS_IMAGE_MP_UP_MISMATCH}, {
  697. ERRHRD, ERRgeneral, 0xc000024a}, {
  698. ERRHRD, ERRgeneral, 0xc000024b}, {
  699. ERRHRD, ERRgeneral, 0xc000024c}, {
  700. ERRHRD, ERRgeneral, 0xc000024d}, {
  701. ERRHRD, ERRgeneral, 0xc000024e}, {
  702. ERRHRD, ERRgeneral, 0xc000024f}, {
  703. ERRHRD, ERRgeneral, NT_STATUS_INSUFFICIENT_LOGON_INFO}, {
  704. ERRHRD, ERRgeneral, NT_STATUS_BAD_DLL_ENTRYPOINT}, {
  705. ERRHRD, ERRgeneral, NT_STATUS_BAD_SERVICE_ENTRYPOINT}, {
  706. ERRHRD, ERRgeneral, NT_STATUS_LPC_REPLY_LOST}, {
  707. ERRHRD, ERRgeneral, NT_STATUS_IP_ADDRESS_CONFLICT1}, {
  708. ERRHRD, ERRgeneral, NT_STATUS_IP_ADDRESS_CONFLICT2}, {
  709. ERRHRD, ERRgeneral, NT_STATUS_REGISTRY_QUOTA_LIMIT}, {
  710. ERRSRV, 3, NT_STATUS_PATH_NOT_COVERED}, {
  711. ERRHRD, ERRgeneral, NT_STATUS_NO_CALLBACK_ACTIVE}, {
  712. ERRHRD, ERRgeneral, NT_STATUS_LICENSE_QUOTA_EXCEEDED}, {
  713. ERRHRD, ERRgeneral, NT_STATUS_PWD_TOO_SHORT}, {
  714. ERRHRD, ERRgeneral, NT_STATUS_PWD_TOO_RECENT}, {
  715. ERRHRD, ERRgeneral, NT_STATUS_PWD_HISTORY_CONFLICT}, {
  716. ERRHRD, ERRgeneral, 0xc000025d}, {
  717. ERRHRD, ERRgeneral, NT_STATUS_PLUGPLAY_NO_DEVICE}, {
  718. ERRHRD, ERRgeneral, NT_STATUS_UNSUPPORTED_COMPRESSION}, {
  719. ERRHRD, ERRgeneral, NT_STATUS_INVALID_HW_PROFILE}, {
  720. ERRHRD, ERRgeneral, NT_STATUS_INVALID_PLUGPLAY_DEVICE_PATH}, {
  721. ERRDOS, 182, NT_STATUS_DRIVER_ORDINAL_NOT_FOUND}, {
  722. ERRDOS, 127, NT_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND}, {
  723. ERRDOS, 288, NT_STATUS_RESOURCE_NOT_OWNED}, {
  724. ERRDOS, ErrTooManyLinks, NT_STATUS_TOO_MANY_LINKS}, {
  725. ERRHRD, ERRgeneral, NT_STATUS_QUOTA_LIST_INCONSISTENT}, {
  726. ERRHRD, ERRgeneral, NT_STATUS_FILE_IS_OFFLINE}, {
  727. ERRDOS, 21, 0xc000026e}, {
  728. ERRDOS, 161, 0xc0000281}, {
  729. ERRDOS, ERRnoaccess, 0xc000028a}, {
  730. ERRDOS, ERRnoaccess, 0xc000028b}, {
  731. ERRHRD, ERRgeneral, 0xc000028c}, {
  732. ERRDOS, ERRnoaccess, 0xc000028d}, {
  733. ERRDOS, ERRnoaccess, 0xc000028e}, {
  734. ERRDOS, ERRnoaccess, 0xc000028f}, {
  735. ERRDOS, ERRnoaccess, 0xc0000290}, {
  736. ERRDOS, ERRbadfunc, 0xc000029c}, {
  737. ERRDOS, ERRinvlevel, 0x007c0001}, };
  738. /*****************************************************************************
  739. Print an error message from the status code
  740. *****************************************************************************/
  741. static void
  742. cifs_print_status(__u32 status_code)
  743. {
  744. int idx = 0;
  745. while (nt_errs[idx].nt_errstr != NULL) {
  746. if (((nt_errs[idx].nt_errcode) & 0xFFFFFF) ==
  747. (status_code & 0xFFFFFF)) {
  748. printk(KERN_NOTICE "Status code returned 0x%08x %s\n",
  749. status_code, nt_errs[idx].nt_errstr);
  750. }
  751. idx++;
  752. }
  753. return;
  754. }
  755. static void
  756. ntstatus_to_dos(__u32 ntstatus, __u8 *eclass, __u16 *ecode)
  757. {
  758. int i;
  759. if (ntstatus == 0) {
  760. *eclass = 0;
  761. *ecode = 0;
  762. return;
  763. }
  764. for (i = 0; ntstatus_to_dos_map[i].ntstatus; i++) {
  765. if (ntstatus == ntstatus_to_dos_map[i].ntstatus) {
  766. *eclass = ntstatus_to_dos_map[i].dos_class;
  767. *ecode = ntstatus_to_dos_map[i].dos_code;
  768. return;
  769. }
  770. }
  771. *eclass = ERRHRD;
  772. *ecode = ERRgeneral;
  773. }
  774. int
  775. map_smb_to_linux_error(struct smb_hdr *smb, int logErr)
  776. {
  777. unsigned int i;
  778. int rc = -EIO; /* if transport error smb error may not be set */
  779. __u8 smberrclass;
  780. __u16 smberrcode;
  781. /* BB if NT Status codes - map NT BB */
  782. /* old style smb error codes */
  783. if (smb->Status.CifsError == 0)
  784. return 0;
  785. if (smb->Flags2 & SMBFLG2_ERR_STATUS) {
  786. /* translate the newer STATUS codes to old style SMB errors
  787. * and then to POSIX errors */
  788. __u32 err = le32_to_cpu(smb->Status.CifsError);
  789. if (logErr && (err != (NT_STATUS_MORE_PROCESSING_REQUIRED)))
  790. cifs_print_status(err);
  791. else if (cifsFYI & CIFS_RC)
  792. cifs_print_status(err);
  793. ntstatus_to_dos(err, &smberrclass, &smberrcode);
  794. } else {
  795. smberrclass = smb->Status.DosError.ErrorClass;
  796. smberrcode = le16_to_cpu(smb->Status.DosError.Error);
  797. }
  798. /* old style errors */
  799. /* DOS class smb error codes - map DOS */
  800. if (smberrclass == ERRDOS) { /* 1 byte field no need to byte reverse */
  801. for (i = 0;
  802. i <
  803. sizeof(mapping_table_ERRDOS) /
  804. sizeof(struct smb_to_posix_error); i++) {
  805. if (mapping_table_ERRDOS[i].smb_err == 0)
  806. break;
  807. else if (mapping_table_ERRDOS[i].smb_err ==
  808. smberrcode) {
  809. rc = mapping_table_ERRDOS[i].posix_code;
  810. break;
  811. }
  812. /* else try next error mapping one to see if match */
  813. }
  814. } else if (smberrclass == ERRSRV) { /* server class of error codes */
  815. for (i = 0;
  816. i <
  817. sizeof(mapping_table_ERRSRV) /
  818. sizeof(struct smb_to_posix_error); i++) {
  819. if (mapping_table_ERRSRV[i].smb_err == 0)
  820. break;
  821. else if (mapping_table_ERRSRV[i].smb_err ==
  822. smberrcode) {
  823. rc = mapping_table_ERRSRV[i].posix_code;
  824. break;
  825. }
  826. /* else try next error mapping to see if match */
  827. }
  828. }
  829. /* else ERRHRD class errors or junk - return EIO */
  830. cFYI(1, ("Mapping smb error code %d to POSIX err %d",
  831. smberrcode, rc));
  832. /* generic corrective action e.g. reconnect SMB session on
  833. * ERRbaduid could be added */
  834. return rc;
  835. }
  836. /*
  837. * calculate the size of the SMB message based on the fixed header
  838. * portion, the number of word parameters and the data portion of the message
  839. */
  840. unsigned int
  841. smbCalcSize(struct smb_hdr *ptr)
  842. {
  843. return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
  844. 2 /* size of the bcc field */ + BCC(ptr));
  845. }
  846. unsigned int
  847. smbCalcSize_LE(struct smb_hdr *ptr)
  848. {
  849. return (sizeof(struct smb_hdr) + (2 * ptr->WordCount) +
  850. 2 /* size of the bcc field */ + le16_to_cpu(BCC_LE(ptr)));
  851. }
  852. /* The following are taken from fs/ntfs/util.c */
  853. #define NTFS_TIME_OFFSET ((u64)(369*365 + 89) * 24 * 3600 * 10000000)
  854. /*
  855. * Convert the NT UTC (based 1601-01-01, in hundred nanosecond units)
  856. * into Unix UTC (based 1970-01-01, in seconds).
  857. */
  858. struct timespec
  859. cifs_NTtimeToUnix(u64 ntutc)
  860. {
  861. struct timespec ts;
  862. /* BB what about the timezone? BB */
  863. /* Subtract the NTFS time offset, then convert to 1s intervals. */
  864. u64 t;
  865. t = ntutc - NTFS_TIME_OFFSET;
  866. ts.tv_nsec = do_div(t, 10000000) * 100;
  867. ts.tv_sec = t;
  868. return ts;
  869. }
  870. /* Convert the Unix UTC into NT UTC. */
  871. u64
  872. cifs_UnixTimeToNT(struct timespec t)
  873. {
  874. /* Convert to 100ns intervals and then add the NTFS time offset. */
  875. return (u64) t.tv_sec * 10000000 + t.tv_nsec/100 + NTFS_TIME_OFFSET;
  876. }
  877. static int total_days_of_prev_months[] =
  878. {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  879. __le64 cnvrtDosCifsTm(__u16 date, __u16 time)
  880. {
  881. return cpu_to_le64(cifs_UnixTimeToNT(cnvrtDosUnixTm(date, time)));
  882. }
  883. struct timespec cnvrtDosUnixTm(__u16 date, __u16 time)
  884. {
  885. struct timespec ts;
  886. int sec, min, days, month, year;
  887. SMB_TIME * st = (SMB_TIME *)&time;
  888. SMB_DATE * sd = (SMB_DATE *)&date;
  889. cFYI(1, ("date %d time %d", date, time));
  890. sec = 2 * st->TwoSeconds;
  891. min = st->Minutes;
  892. if ((sec > 59) || (min > 59))
  893. cERROR(1, ("illegal time min %d sec %d", min, sec));
  894. sec += (min * 60);
  895. sec += 60 * 60 * st->Hours;
  896. if (st->Hours > 24)
  897. cERROR(1, ("illegal hours %d", st->Hours));
  898. days = sd->Day;
  899. month = sd->Month;
  900. if ((days > 31) || (month > 12)) {
  901. cERROR(1, ("illegal date, month %d day: %d", month, days));
  902. if (month > 12)
  903. month = 12;
  904. }
  905. month -= 1;
  906. days += total_days_of_prev_months[month];
  907. days += 3652; /* account for difference in days between 1980 and 1970 */
  908. year = sd->Year;
  909. days += year * 365;
  910. days += (year/4); /* leap year */
  911. /* generalized leap year calculation is more complex, ie no leap year
  912. for years/100 except for years/400, but since the maximum number for DOS
  913. year is 2**7, the last year is 1980+127, which means we need only
  914. consider 2 special case years, ie the years 2000 and 2100, and only
  915. adjust for the lack of leap year for the year 2100, as 2000 was a
  916. leap year (divisable by 400) */
  917. if (year >= 120) /* the year 2100 */
  918. days = days - 1; /* do not count leap year for the year 2100 */
  919. /* adjust for leap year where we are still before leap day */
  920. if (year != 120)
  921. days -= ((year & 0x03) == 0) && (month < 2 ? 1 : 0);
  922. sec += 24 * 60 * 60 * days;
  923. ts.tv_sec = sec;
  924. /* cFYI(1,("sec after cnvrt dos to unix time %d",sec)); */
  925. ts.tv_nsec = 0;
  926. return ts;
  927. }