DATA_BLOB data_blob(const void *p, size_t length) { DATA_BLOB ret; if (!length) { ZERO_STRUCT(ret); return ret; } if (p) { ret.data = (uint8 *)smb_xmemdup(p, length); } else { ret.data = SMB_XMALLOC_ARRAY(uint8, length); } ret.length = length; ret.free = free_data_blob; return ret; }
static BOOL make_lock_list(PyObject *py_keys, TDB_DATA **keys, int *num_keys) { /* Are we a list or a string? */ if (!PyList_Check(py_keys) && !PyString_Check(py_keys)) { PyErr_SetString(PyExc_TypeError, "arg must be list of string"); return False; } if (PyList_Check(py_keys)) { int i; /* Turn python list into array of keys */ *num_keys = PyList_Size(py_keys); *keys = (TDB_DATA *)SMB_XMALLOC_ARRAY(TDB_DATA, (*num_keys)); for (i = 0; i < *num_keys; i++) { PyObject *key = PyList_GetItem(py_keys, i); if (!PyString_Check(key)) { PyErr_SetString( PyExc_TypeError, "list elements must be strings"); return False; } PyArg_Parse(key, "s#", &(*keys)[i].dptr, &(*keys)[i].dsize); } } else { /* Turn python string into a single key */ *keys = (TDB_DATA *)SMB_XMALLOC_P(TDB_DATA); *num_keys = 1; PyArg_Parse(py_keys, "s#", &(*keys)->dptr, &(*keys)->dsize); } return True; }
BOOL cli_dfs_get_referral( struct cli_state *cli, const char *path, CLIENT_DFS_REFERRAL**refs, size_t *num_refs, uint16 *consumed) { unsigned int data_len = 0; unsigned int param_len = 0; uint16 setup = TRANSACT2_GET_DFS_REFERRAL; char param[sizeof(pstring)+2]; pstring data; char *rparam=NULL, *rdata=NULL; char *p; size_t pathlen = 2*(strlen(path)+1); uint16 num_referrals; CLIENT_DFS_REFERRAL *referrals = NULL; memset(param, 0, sizeof(param)); SSVAL(param, 0, 0x03); /* max referral level */ p = ¶m[2]; p += clistr_push(cli, p, path, MIN(pathlen, sizeof(param)-2), STR_TERMINATE); param_len = PTR_DIFF(p, param); if (!cli_send_trans(cli, SMBtrans2, NULL, /* name */ -1, 0, /* fid, flags */ &setup, 1, 0, /* setup, length, max */ param, param_len, 2, /* param, length, max */ (char *)&data, data_len, cli->max_xmit /* data, length, max */ )) { return False; } if (!cli_receive_trans(cli, SMBtrans2, &rparam, ¶m_len, &rdata, &data_len)) { return False; } *consumed = SVAL( rdata, 0 ); num_referrals = SVAL( rdata, 2 ); if ( num_referrals != 0 ) { uint16 ref_version; uint16 ref_size; int i; uint16 node_offset; referrals = SMB_XMALLOC_ARRAY( CLIENT_DFS_REFERRAL, num_referrals ); /* start at the referrals array */ p = rdata+8; for ( i=0; i<num_referrals; i++ ) { ref_version = SVAL( p, 0 ); ref_size = SVAL( p, 2 ); node_offset = SVAL( p, 16 ); if ( ref_version != 3 ) { p += ref_size; continue; } referrals[i].proximity = SVAL( p, 8 ); referrals[i].ttl = SVAL( p, 10 ); clistr_pull( cli, referrals[i].dfspath, p+node_offset, sizeof(referrals[i].dfspath), -1, STR_TERMINATE|STR_UNICODE ); p += ref_size; } } *num_refs = num_referrals; *refs = referrals; SAFE_FREE(rdata); SAFE_FREE(rparam); return True; }