static int ejs_unlink(MprVarHandle eid, int argc, MprVar **argv) { struct smbcli_tree *tree; NTSTATUS result; if (argc != 2) { ejsSetErrorMsg(eid, "unlink(): invalid number of args"); return -1; } if (!IS_TREE_HANDLE(argv[0])) { ejsSetErrorMsg(eid, "first arg is not a tree handle"); return -1; } tree = argv[0]->ptr; if (!mprVarIsString(argv[1]->type)) { ejsSetErrorMsg(eid, "arg 2 must be a string"); return -1; } result = smbcli_unlink(tree, argv[1]->string); mpr_Return(eid, mprNTSTATUS(result)); return 0; }
static int ejs_cli_connect(MprVarHandle eid, int argc, char **argv) { struct smbcli_socket *sock; struct smbcli_transport *transport; struct nbt_name calling, called; NTSTATUS result; if (argc != 1) { ejsSetErrorMsg(eid, "connect invalid arguments"); return -1; } /* Socket connect */ sock = smbcli_sock_init(NULL, NULL); if (!sock) { ejsSetErrorMsg(eid, "socket initialisation failed"); return -1; } if (!smbcli_sock_connect_byname(sock, argv[0], 0)) { ejsSetErrorMsg(eid, "socket connect failed"); return -1; } transport = smbcli_transport_init(sock, sock, False); if (!transport) { ejsSetErrorMsg(eid, "transport init failed"); return -1; } /* Send a netbios session request */ make_nbt_name_client(&calling, lp_netbios_name()); nbt_choose_called_name(NULL, &called, argv[0], NBT_NAME_SERVER); if (!smbcli_transport_connect(transport, &calling, &called)) { ejsSetErrorMsg(eid, "transport establishment failed"); return -1; } result = smb_raw_negotiate(transport, lp_maxprotocol()); if (!NT_STATUS_IS_OK(result)) { mpr_Return(eid, mprNTSTATUS(result)); return 0; } /* Return a socket object */ mpr_Return(eid, mprCreatePtrVar(transport)); return 0; }
static int ejs_tree_connect(MprVarHandle eid, int argc, char **argv) { struct cli_credentials *creds; struct smb_composite_connect io; struct smbcli_tree *tree; char *hostname, *sharename; NTSTATUS result; TALLOC_CTX *mem_ctx; if (argc != 2) { ejsSetErrorMsg(eid, "tree_connect(): invalid number of args"); return -1; } /* Set up host, share destination */ mem_ctx = talloc_new(mprMemCtx()); smbcli_parse_unc(argv[0], mem_ctx, &hostname, &sharename); /* Set up credentials */ creds = cli_credentials_init(NULL); cli_credentials_set_conf(creds); cli_credentials_parse_string(creds, argv[1], CRED_SPECIFIED); /* Do connect */ io.in.dest_host = hostname; io.in.port = 0; io.in.called_name = strupper_talloc(mem_ctx, hostname); io.in.service = sharename; io.in.service_type = "?????"; io.in.credentials = creds; io.in.fallback_to_anonymous = False; io.in.workgroup = lp_workgroup(); result = smb_composite_connect(&io, mem_ctx, NULL); tree = io.out.tree; talloc_free(mem_ctx); if (!NT_STATUS_IS_OK(result)) { mpr_Return(eid, mprNTSTATUS(result)); return 0; } mpr_Return(eid, mprCreatePtrVar(tree)); return 0; }
/* Properties: UserListCtx.Users[] UserListCtx.ResumeIndex UserListCtx.Count UserListCtx.EndOfList UserListCtx.Status */ struct MprVar mprUserListCtx(TALLOC_CTX *mem_ctx, struct libnet_UserList *list, NTSTATUS result) { const char *name = "UserListCtx"; NTSTATUS status; bool endOfList; struct MprVar mprListCtx, mprUserList; struct MprVar mprUser, mprSid, mprUsername; int i; if (list == NULL || mem_ctx == NULL) { mprListCtx = mprCreateNullVar(); goto done; } endOfList = (NT_STATUS_EQUAL(result, NT_STATUS_NO_MORE_ENTRIES) || NT_STATUS_IS_OK(result)); mprUserList = mprArray("Users"); for (i = 0; i < list->out.count; i++) { struct userlist u = list->out.users[i]; /* get userlist fields */ mprSid = mprString(u.sid); mprUsername = mprString(u.username); /* create userlist object */ mprUser = mprObject("User"); mprSetVar(&mprUser, "Username", mprUsername); mprSetVar(&mprUser, "SID", mprSid); /* add the object to the array being constructed */ mprAddArray(&mprUserList, i, mprUser); } mprListCtx = mprObject(name); status = mprSetVar(&mprListCtx, "Users", mprUserList); if (!NT_STATUS_IS_OK(status)) goto done; status = mprSetVar(&mprListCtx, "Count", mprCreateIntegerVar(list->out.count)); if (!NT_STATUS_IS_OK(status)) goto done; status = mprSetVar(&mprListCtx, "ResumeIndex", mprCreateIntegerVar((int)list->out.resume_index)); if (!NT_STATUS_IS_OK(status)) goto done; status = mprSetVar(&mprListCtx, "EndOfList", mprCreateBoolVar(endOfList)); if (!NT_STATUS_IS_OK(status)) goto done; status = mprSetVar(&mprListCtx, "Status", mprNTSTATUS(result)); done: return mprListCtx; }
static int ejs_resolve_name(MprVarHandle eid, int argc, struct MprVar **argv) { int result = -1; struct nbt_name name; TALLOC_CTX *tmp_ctx = talloc_new(mprMemCtx()); NTSTATUS nt_status; const char *reply_addr; /* validate arguments */ if (argc < 2 || argc > 3) { ejsSetErrorMsg(eid, "resolveName invalid arguments"); goto done; } if (argv[0]->type != MPR_TYPE_OBJECT) { ejsSetErrorMsg(eid, "resolvename invalid arguments"); goto done; } if (argv[1]->type != MPR_TYPE_STRING) { ejsSetErrorMsg(eid, "resolveName invalid arguments"); goto done; } if (argc == 2) { make_nbt_name_client(&name, mprToString(argv[1])); } else { if (!mprVarIsNumber(argv[1]->type)) { ejsSetErrorMsg(eid, "resolveName invalid arguments"); goto done; } make_nbt_name(&name, mprToString(argv[1]), mprToInt(argv[2])); } result = 0; nt_status = resolve_name(&name, tmp_ctx, &reply_addr, event_context_find(tmp_ctx)); if (NT_STATUS_IS_OK(nt_status)) { mprSetPropertyValue(argv[0], "value", mprString(reply_addr)); } mpr_Return(eid, mprNTSTATUS(nt_status)); done: talloc_free(tmp_ctx); return result; }
static int ejs_tree_disconnect(MprVarHandle eid, int argc, MprVar **argv) { struct smbcli_tree *tree; NTSTATUS result; if (argc != 1) { ejsSetErrorMsg(eid, "tree_disconnect(): invalid number of args"); return -1; } if (!IS_TREE_HANDLE(argv[0])) { ejsSetErrorMsg(eid, "first arg is not a tree handle"); return -1; } tree = talloc_check_name(argv[0]->ptr, "struct smbcli_tree"); result = smb_tree_disconnect(tree); mpr_Return(eid, mprNTSTATUS(result)); return 0; }