diff --git a/src/modules/system/nt.c b/src/modules/system/nt.c index 8fbf69eb9ee9c13a2358a1634b5caa90fd0ba3d9..f78b69aeefe06cbe72391665a8dfa4292433563d 100644 --- a/src/modules/system/nt.c +++ b/src/modules/system/nt.c @@ -1,5 +1,5 @@ /* - * $Id: nt.c,v 1.26 2000/08/25 10:50:37 grubba Exp $ + * $Id: nt.c,v 1.27 2000/09/11 18:45:06 leif Exp $ * * NT system calls for Pike * @@ -30,6 +30,103 @@ #include <accctrl.h> #include <lm.h> +static void throw_nt_error(char *funcname, int err) +/* + * Give string equivalents to some of the more common NT error codes. + */ +{ + char *msg; + + switch (err) + { + case ERROR_ACCESS_DENIED: + msg = "Access denied."; + break; + + case ERROR_LOGON_FAILURE: + msg = "Logon failure (access denied)."; + break; + + case ERROR_INVALID_PARAMETER: + msg = "Invalid parameter."; + break; + + case ERROR_NOT_ENOUGH_MEMORY: + msg = "Out of memory."; + break; + + case ERROR_INVALID_NAME: + msg = "Invalid name."; + break; + + case ERROR_INVALID_LEVEL: + msg = "Invalid level."; + break; + + case ERROR_NO_SUCH_ALIAS: + msg = "No such alias."; + break; + + case ERROR_NO_SUCH_DOMAIN: + msg = "No such domain."; + break; + + case ERROR_NO_LOGON_SERVERS: + msg = "No log-on servers."; + break; + + case ERROR_BAD_NETPATH: + msg = "Network path not found."; + break; + + case ERROR_NO_TRUST_LSA_SECRET: + msg = "No trust LSA secret (client not trusted)."; + break; + + case ERROR_NO_TRUST_SAM_ACCOUNT: + msg = "No trust SAM account (server/password not trusted)."; + break; + + case ERROR_DOMAIN_TRUST_INCONSISTENT: + msg = "Domain trust inconsistent."; + break; + + case NERR_DCNotFound: + msg = "Domain controller not found."; + break; + + case NERR_InvalidComputer: + msg = "Invalid computer."; + break; + + case NERR_UserNotFound: + msg = "User not found."; + break; + + case NERR_GroupNotFound: + msg = "Group not found."; + break; + + case NERR_ClientNameNotFound: + msg = "Client name not found."; + break; + + case RPC_S_SERVER_UNAVAILABLE: + msg = "RPC server unavailable."; + break; + + case NERR_Success: + msg = "Strange error (NERR_Success)."; + break; + + default: + error("%s: Unknown error 0x%04x (%d)\n", funcname, err, err); + return; + } + error("%s: %s\n", funcname, msg); +} + + static void f_cp(INT32 args) { char *from, *to; @@ -130,7 +227,7 @@ void f_RegGetValue(INT32 args) ret = RegOpenKeyEx(hkeys[hkey_num], (LPCTSTR)key, 0, KEY_READ, &new_key); if(ret != ERROR_SUCCESS) - error("RegOpenKeyEx failed with error %d\n",ret); + throw_nt_error("RegOpenKeyEx", ret); ret=RegQueryValueEx(new_key,ind, 0, &type, buffer, &len); RegCloseKey(new_key); @@ -140,7 +237,7 @@ void f_RegGetValue(INT32 args) pop_n_elems(args); push_regvalue(type, buffer, len); }else{ - error("RegQueryValueEx failed with error %d\n",ret); + throw_nt_error("RegQueryValueEx", ret); } } @@ -165,7 +262,7 @@ void f_RegGetKeyNames(INT32 args) ret = RegOpenKeyEx(hkeys[hkey_num], (LPCTSTR)key, 0, KEY_READ, &new_key); if(ret != ERROR_SUCCESS) - error("RegOpenKeyEx failed with error %d\n",ret); + throw_nt_error("RegGetKeyNames[RegOpenKeyEx]", ret); SET_ONERROR(tmp, do_regclosekey, new_key); @@ -190,7 +287,7 @@ void f_RegGetKeyNames(INT32 args) break; default: - error("RegEnumKeyEx failed with error %d\n",ret); + throw_nt_error("RegGetKeyNames[RegEnumKeyEx]", ret); } break; } @@ -216,7 +313,7 @@ void f_RegGetValues(INT32 args) ret = RegOpenKeyEx(hkeys[hkey_num], (LPCTSTR)key, 0, KEY_READ, &new_key); if(ret != ERROR_SUCCESS) - error("RegOpenKeyEx failed with error %d\n",ret); + throw_nt_error("RegOpenKeyEx", ret); SET_ONERROR(tmp, do_regclosekey, new_key); pop_n_elems(args); @@ -245,7 +342,7 @@ void f_RegGetValues(INT32 args) default: RegCloseKey(new_key); - error("RegEnumKeyEx failed with error %d\n",ret); + throw_nt_error("RegGetValues[RegEnumKeyEx]", ret); } break; } @@ -866,29 +963,13 @@ void f_NetUserGetInfo(INT32 args) if(to_free1) free(to_free1); if(to_free2) free(to_free2); - switch(ret) + if (ret == NERR_Success) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - error("NetGetUserInfo: Access denied.\n"); - break; - - case NERR_InvalidComputer: - error("NetGetUserInfo: Invalid computer.\n"); - break; - - case NERR_UserNotFound: - push_int(0); - return; - - case NERR_Success: - encode_user_info(tmp,level); - netapibufferfree(tmp); - return; - - default: - error("NetGetUserInfo: Unknown error %d\n",ret); + encode_user_info(tmp,level); + netapibufferfree(tmp); } + else + throw_nt_error("NetGetUserInfo", ret); } void f_NetUserEnum(INT32 args) @@ -900,6 +981,7 @@ void f_NetUserEnum(INT32 args) INT32 pos=0,e; struct array *a=0; DWORD resume=0; + NET_API_STATUS ret; /* fprintf(stderr,"before: sp=%p args=%d (base=%p)\n",sp,args,sp-args); */ @@ -928,10 +1010,11 @@ void f_NetUserEnum(INT32 args) /* fprintf(stderr,"now: sp=%p\n",sp); */ - while(1) + ret = ERROR_MORE_DATA; + + do { DWORD read=0, total=0; - NET_API_STATUS ret; LPBYTE buf=0,ptr; THREADS_ALLOW(); @@ -939,49 +1022,37 @@ void f_NetUserEnum(INT32 args) level, filter, &buf, - 0x10000, + 0x4000, &read, &total, &resume); THREADS_DISALLOW(); if(!a) push_array(a=allocate_array(total)); - switch(ret) - { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - error("NetUserEnum: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - error("NetUserEnum: Invalid computer.\n"); - break; - - case NERR_Success: - case ERROR_MORE_DATA: - ptr=buf; - for(e=0;e<read;e++) - { - encode_user_info(ptr,level); - a->item[pos]=sp[-1]; - sp--; - dmalloc_touch_svalue(sp); - pos++; - if(pos>=a->size) break; - ptr+=sizeof_user_info(level); - } - netapibufferfree(buf); - if(ret==ERROR_MORE_DATA) continue; - break; - default: - error("NetUserEnum: Unknown error %d\n",ret); + if (ret == NERR_Success || ret == ERROR_MORE_DATA) + { + ptr=buf; + for(e=0;e<read;e++) + { + encode_user_info(ptr,level); + a->item[pos]=sp[-1]; + sp--; + dmalloc_touch_svalue(sp); + pos++; + if(pos>=a->size) break; + ptr+=sizeof_user_info(level); + } + netapibufferfree(buf); } - break; - } - if(to_free1) free(to_free1); + else + { if (to_free1) free(to_free1); + throw_nt_error("NetUserEnum", ret); + return; + } + } while (ret == ERROR_MORE_DATA); + + if (to_free1) free(to_free1); } @@ -993,6 +1064,7 @@ void f_NetGroupEnum(INT32 args) INT32 pos=0,e; struct array *a=0; DWORD resume=0; + NET_API_STATUS ret; check_all_args("NetGroupEnum",args,BIT_STRING|BIT_INT|BIT_VOID, BIT_INT|BIT_VOID,0); @@ -1012,10 +1084,9 @@ void f_NetGroupEnum(INT32 args) pop_n_elems(args); - while(1) + do { DWORD read=0, total=0; - NET_API_STATUS ret; LPBYTE buf=0,ptr; THREADS_ALLOW(); @@ -1030,41 +1101,29 @@ void f_NetGroupEnum(INT32 args) if(!a) push_array(a=allocate_array(total)); - switch(ret) + if (ret == NERR_Success || ret == ERROR_MORE_DATA) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - error("NetGroupEnum: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - error("NetGroupEnum: Invalid computer.\n"); - break; - - case NERR_Success: - case ERROR_MORE_DATA: - ptr=buf; - for(e=0;e<read;e++) - { - encode_group_info(ptr,level); - a->item[pos]=sp[-1]; - sp--; - dmalloc_touch_svalue(sp); - pos++; - if(pos>=a->size) break; - ptr+=sizeof_group_info(level); - } - netapibufferfree(buf); - if(ret==ERROR_MORE_DATA) continue; - break; - - default: - error("NetGroupEnum: Unknown error %d\n",ret); + ptr=buf; + for(e=0;e<read;e++) + { + encode_group_info(ptr,level); + a->item[pos]=sp[-1]; + sp--; + dmalloc_touch_svalue(sp); + pos++; + if(pos>=a->size) break; + ptr+=sizeof_group_info(level); + } + netapibufferfree(buf); } - break; - } + else + { + if (to_free1) free(to_free1); + throw_nt_error("NetGroupEnum", ret); + return; + } + } while (ret == ERROR_MORE_DATA); + if(to_free1) free(to_free1); } @@ -1076,6 +1135,7 @@ void f_NetLocalGroupEnum(INT32 args) INT32 pos=0,e; struct array *a=0; DWORD resume=0; + NET_API_STATUS ret; check_all_args("NetLocalGroupEnum",args,BIT_STRING|BIT_INT|BIT_VOID, BIT_INT|BIT_VOID,0); @@ -1095,10 +1155,9 @@ void f_NetLocalGroupEnum(INT32 args) pop_n_elems(args); - while(1) + do { DWORD read=0, total=0; - NET_API_STATUS ret; LPBYTE buf=0,ptr; THREADS_ALLOW(); @@ -1113,41 +1172,28 @@ void f_NetLocalGroupEnum(INT32 args) if(!a) push_array(a=allocate_array(total)); - switch(ret) + if (ret == NERR_Success || ret == ERROR_MORE_DATA) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - error("NetLocalGroupEnum: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - error("NetLocalGroupEnum: Invalid computer.\n"); - break; - - case NERR_Success: - case ERROR_MORE_DATA: - ptr=buf; - for(e=0;e<read;e++) - { - encode_localgroup_info(ptr,level); - a->item[pos]=sp[-1]; - sp--; - dmalloc_touch_svalue(sp); - pos++; - if(pos>=a->size) break; - ptr+=sizeof_localgroup_info(level); - } - netapibufferfree(buf); - if(ret==ERROR_MORE_DATA) continue; - break; - - default: - error("NetLocalGroupEnum: Unknown error %d\n",ret); + ptr=buf; + for(e=0;e<read;e++) + { + encode_localgroup_info(ptr,level); + a->item[pos]=sp[-1]; + sp--; + dmalloc_touch_svalue(sp); + pos++; + if(pos>=a->size) break; + ptr+=sizeof_localgroup_info(level); + } + netapibufferfree(buf); } - break; - } + else + { + if (to_free1) free(to_free1); + throw_nt_error("NetLocalGroupEnum", ret); + } + } while (ret == ERROR_MORE_DATA); + if(to_free1) free(to_free1); } @@ -1197,22 +1243,8 @@ void f_NetUserGetGroups(INT32 args) if(!a) push_array(a=allocate_array(total)); - switch(ret) + if (ret == NERR_Success) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetUserGetGroups: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetUserGetGroups: Invalid computer.\n"); - break; - - case NERR_Success: ptr=buf; for(e=0;e<read;e++) { @@ -1225,13 +1257,15 @@ void f_NetUserGetGroups(INT32 args) ptr+=sizeof_group_users_info(level); } netapibufferfree(buf); - break; - - default: - error("NetUserGetGroups: Unknown error %d\n",ret); + if(to_free1) free(to_free1); + if(to_free2) free(to_free2); + } + else + { + if(to_free1) free(to_free1); + if(to_free2) free(to_free2); + throw_nt_error("NetUserGetGroups", ret); } - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); } void f_NetUserGetLocalGroups(INT32 args) @@ -1287,36 +1321,25 @@ void f_NetUserGetLocalGroups(INT32 args) switch(ret) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetUserGetLocalGroups: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetUserGetLocalGroups: Invalid computer.\n"); - break; - - case NERR_Success: - ptr=buf; - for(e=0;e<read;e++) - { - encode_localgroup_users_info(ptr,level); - a->item[pos]=sp[-1]; - sp--; - dmalloc_touch_svalue(sp); - pos++; - if(pos>=a->size) break; - ptr+=sizeof_localgroup_users_info(level); - } - netapibufferfree(buf); - break; + case NERR_Success: + ptr=buf; + for(e=0;e<read;e++) + { + encode_localgroup_users_info(ptr,level); + a->item[pos]=sp[-1]; + sp--; + dmalloc_touch_svalue(sp); + pos++; + if(pos>=a->size) break; + ptr+=sizeof_localgroup_users_info(level); + } + netapibufferfree(buf); + break; - default: - error("NetUserGetLocalGroups: Unknown error %d\n",ret); + default: + if(to_free1) free(to_free1); + if(to_free2) free(to_free2); + throw_nt_error("NetUserGetLocalGroups", ret); } if(to_free1) free(to_free1); if(to_free2) free(to_free2); @@ -1374,25 +1397,6 @@ void f_NetGroupGetUsers(INT32 args) switch(ret) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetGroupGetUsers: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetGroupGetUsers: Invalid computer.\n"); - break; - - case NERR_GroupNotFound: - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetGroupGetUsers: Group not found.\n"); - break; - case NERR_Success: case ERROR_MORE_DATA: ptr=buf; @@ -1411,7 +1415,9 @@ void f_NetGroupGetUsers(INT32 args) break; default: - error("NetGroupGetUsers: Unknown error %d\n",ret); + if(to_free1) free(to_free1); + if(to_free2) free(to_free2); + throw_nt_error("NetGroupGetUsers", ret); } break; } @@ -1471,25 +1477,6 @@ void f_NetLocalGroupGetMembers(INT32 args) switch(ret) { - case ERROR_ACCESS_DENIED: - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetLocalGroupGetMembers: Access denied.\n"); - break; - - case NERR_InvalidComputer: - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetLocalGroupGetMembers: Invalid computer.\n"); - break; - - case NERR_GroupNotFound: - if(to_free1) free(to_free1); - if(to_free2) free(to_free2); - error("NetLocalGroupGetMembers: Group not found.\n"); - break; - case ERROR_NO_SUCH_ALIAS: if(to_free1) free(to_free1); if(to_free2) free(to_free2); @@ -1514,7 +1501,10 @@ void f_NetLocalGroupGetMembers(INT32 args) break; default: - error("NetLocalGroupGetMembers: Unknown error %d\n",ret); + if(to_free1) free(to_free1); + if(to_free2) free(to_free2); + throw_nt_error("NetLocalGroupGetMembers", ret); + break; } break; } @@ -1558,29 +1548,13 @@ void f_NetGetDCName(INT32 args) switch(ret) { - case NERR_DCNotFound: - error("NetGetDCName: Could not find the domain controller for the domain.\n"); - break; - - case ERROR_INVALID_NAME: - error("NetGetDCName: The name could not be found.\n"); - break; - - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - error("NetGetDCName: Access denied.\n"); - break; - - case RPC_S_SERVER_UNAVAILABLE: /* Known to be returned sometimes.. */ - error("NetGetDCName: The RPC server is unavailable.\n"); - break; - case NERR_Success: SAFE_PUSH_WSTR(tmp); netapibufferfree(tmp); return; default: - error("NetGetDCName: Unknown error %d\n",ret); + throw_nt_error("NetGetDCName", ret); } } @@ -1620,41 +1594,13 @@ void f_NetGetAnyDCName(INT32 args) switch(ret) { - case ERROR_NO_LOGON_SERVERS: - error("NetGetAnyDCName: No domain controllers could be found.\n"); - break; - - case ERROR_NO_SUCH_DOMAIN: - error("NetGetAnyDCName: The specified domain is not a trusted domain.\n"); - break; - - case ERROR_NO_TRUST_LSA_SECRET: - error("NetGetAnyDCName: The client side of the trust relationship is broken.\n"); - break; - - case ERROR_NO_TRUST_SAM_ACCOUNT: - error("NetGetAnyDCName: The server side of the trust relationship is broken or the password is broken.\n"); - break; - - case ERROR_DOMAIN_TRUST_INCONSISTENT: - error("NetGetAnyDCName: The server that responded is not a proper domain controller of the specified domain.\n"); - break; - - case ERROR_LOGON_FAILURE: /* Known to be returned sometimes.. */ - error("NetGetAnyDCName: Access denied.\n"); - break; - - case RPC_S_SERVER_UNAVAILABLE: /* Known to be returned sometimes.. */ - error("NetGetAnyDCName: The RPC server is unavailable.\n"); - break; - case NERR_Success: SAFE_PUSH_WSTR(tmp); netapibufferfree(tmp); return; default: - error("NetGetAnyDCName: Unknown error %d\n",ret); + throw_nt_error("NetGetAnyDCName", ret); } } @@ -1676,8 +1622,12 @@ static LPWSTR get_wstring(struct svalue *s) /* Fall through */ case 1: return STR1(s->u.string); - case 2: - error("String too wide!\n"); + default: + error("Bad string width.\n"); + /* we never get here, but the "return (LPWSTR)0" makes the compiler + * stop complaining about our not returning a value here. + */ + return (LPWSTR)0; } } @@ -1692,54 +1642,6 @@ LINKFUNC(NET_API_STATUS, netwkstauserenum, (LPWSTR, DWORD, LPBYTE *, DWORD, LPDWORD, LPDWORD, LPDWORD)); -static void throw_nt_error(char *funcname, int err) -{ - char *msg; - - switch (err) - { - case ERROR_ACCESS_DENIED: - msg = "Access denied."; - break; - - case ERROR_LOGON_FAILURE: - msg = "Logon failure (access denied)."; - break; - - case ERROR_INVALID_PARAMETER: - msg = "Invalid parameter."; - break; - - case ERROR_NOT_ENOUGH_MEMORY: - msg = "Out of memory."; - break; - - case ERROR_INVALID_LEVEL: - msg = "Invalid level."; - break; - - case NERR_InvalidComputer: - msg = "Invalid computer."; - break; - - case NERR_UserNotFound: - msg = "User not found."; - break; - - case NERR_ClientNameNotFound: - msg = "Client name not found."; - break; - - case NERR_Success: - msg = "Strange error (NERR_Success)."; - break; - - default: - error("%s: Unknown error 0x%ux\n", funcname, err); - } - error("%s: %s\n", funcname, msg); -} - static void low_encode_session_info_0(SESSION_INFO_0 *tmp) { SAFE_PUSH_WSTR(tmp->sesi0_cname); @@ -1896,7 +1798,7 @@ static void f_NetSessionEnum(INT32 args) /* valid levels */ break; default: - error("System.NetSessionEnum: Unsupported level: %d.\n", level); + error("NetSessionEnum: Unsupported level: %d.\n", level); } @@ -1966,7 +1868,7 @@ static void f_NetWkstaUserEnum(INT32 args) level=sp[1-args].u.integer; if (level != 0 && level != 1) - error("System.NetWkstaUserEnum: Unsupported level: %d.\n", level); + error("NetWkstaUserEnum: Unsupported level: %d.\n", level); while(1) {