1/* 2 * Unix SMB/CIFS implementation. 3 * NetApi Server Support 4 * Copyright (C) Guenther Deschner 2007 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, see <http://www.gnu.org/licenses/>. 18 */ 19 20#include "includes.h" 21 22#include "librpc/gen_ndr/libnetapi.h" 23#include "lib/netapi/netapi.h" 24#include "lib/netapi/netapi_private.h" 25#include "lib/netapi/libnetapi.h" 26#include "libnet/libnet.h" 27#include "../librpc/gen_ndr/cli_srvsvc.h" 28 29/**************************************************************** 30****************************************************************/ 31 32static WERROR NetServerGetInfo_l_101(struct libnetapi_ctx *ctx, 33 uint8_t **buffer) 34{ 35 struct SERVER_INFO_101 i; 36 37 i.sv101_platform_id = PLATFORM_ID_NT; 38 i.sv101_name = global_myname(); 39 i.sv101_version_major = lp_major_announce_version(); 40 i.sv101_version_minor = lp_minor_announce_version(); 41 i.sv101_type = lp_default_server_announce(); 42 i.sv101_comment = lp_serverstring(); 43 44 *buffer = (uint8_t *)talloc_memdup(ctx, &i, sizeof(i)); 45 if (!*buffer) { 46 return WERR_NOMEM; 47 } 48 49 return WERR_OK; 50} 51 52/**************************************************************** 53****************************************************************/ 54 55static WERROR NetServerGetInfo_l_1005(struct libnetapi_ctx *ctx, 56 uint8_t **buffer) 57{ 58 struct SERVER_INFO_1005 info1005; 59 60 info1005.sv1005_comment = lp_serverstring(); 61 *buffer = (uint8_t *)talloc_memdup(ctx, &info1005, sizeof(info1005)); 62 if (!*buffer) { 63 return WERR_NOMEM; 64 } 65 66 return WERR_OK; 67} 68 69/**************************************************************** 70****************************************************************/ 71 72WERROR NetServerGetInfo_l(struct libnetapi_ctx *ctx, 73 struct NetServerGetInfo *r) 74{ 75 switch (r->in.level) { 76 case 101: 77 return NetServerGetInfo_l_101(ctx, r->out.buffer); 78 case 1005: 79 return NetServerGetInfo_l_1005(ctx, r->out.buffer); 80 default: 81 break; 82 } 83 84 return WERR_UNKNOWN_LEVEL; 85} 86 87/**************************************************************** 88****************************************************************/ 89 90static NTSTATUS map_server_info_to_SERVER_INFO_buffer(TALLOC_CTX *mem_ctx, 91 uint32_t level, 92 union srvsvc_NetSrvInfo *i, 93 uint8_t **buffer) 94{ 95 struct SERVER_INFO_100 i100; 96 struct SERVER_INFO_101 i101; 97 struct SERVER_INFO_102 i102; 98 struct SERVER_INFO_402 i402; 99 struct SERVER_INFO_403 i403; 100 struct SERVER_INFO_502 i502; 101 struct SERVER_INFO_503 i503; 102 struct SERVER_INFO_599 i599; 103 struct SERVER_INFO_1005 i1005; 104#if 0 105 struct SERVER_INFO_1010 i1010; 106 struct SERVER_INFO_1016 i1016; 107 struct SERVER_INFO_1017 i1017; 108 struct SERVER_INFO_1018 i1018; 109 struct SERVER_INFO_1107 i1107; 110 struct SERVER_INFO_1501 i1501; 111 struct SERVER_INFO_1502 i1502; 112 struct SERVER_INFO_1503 i1503; 113 struct SERVER_INFO_1506 i1506; 114 struct SERVER_INFO_1509 i1509; 115 struct SERVER_INFO_1510 i1510; 116 struct SERVER_INFO_1511 i1511; 117 struct SERVER_INFO_1512 i1512; 118 struct SERVER_INFO_1513 i1513; 119 struct SERVER_INFO_1514 i1514; 120 struct SERVER_INFO_1515 i1515; 121 struct SERVER_INFO_1516 i1516; 122 struct SERVER_INFO_1518 i1518; 123 struct SERVER_INFO_1520 i1520; 124 struct SERVER_INFO_1521 i1521; 125 struct SERVER_INFO_1522 i1522; 126 struct SERVER_INFO_1523 i1523; 127 struct SERVER_INFO_1524 i1524; 128 struct SERVER_INFO_1525 i1525; 129 struct SERVER_INFO_1528 i1528; 130 struct SERVER_INFO_1529 i1529; 131 struct SERVER_INFO_1530 i1530; 132 struct SERVER_INFO_1533 i1533; 133 struct SERVER_INFO_1534 i1534; 134 struct SERVER_INFO_1535 i1535; 135 struct SERVER_INFO_1536 i1536; 136 struct SERVER_INFO_1537 i1537; 137 struct SERVER_INFO_1538 i1538; 138 struct SERVER_INFO_1539 i1539; 139 struct SERVER_INFO_1540 i1540; 140 struct SERVER_INFO_1541 i1541; 141 struct SERVER_INFO_1542 i1542; 142 struct SERVER_INFO_1543 i1543; 143 struct SERVER_INFO_1544 i1544; 144 struct SERVER_INFO_1545 i1545; 145 struct SERVER_INFO_1546 i1546; 146 struct SERVER_INFO_1547 i1547; 147 struct SERVER_INFO_1548 i1548; 148 struct SERVER_INFO_1549 i1549; 149 struct SERVER_INFO_1550 i1550; 150 struct SERVER_INFO_1552 i1552; 151 struct SERVER_INFO_1553 i1553; 152 struct SERVER_INFO_1554 i1554; 153 struct SERVER_INFO_1555 i1555; 154 struct SERVER_INFO_1556 i1556; 155 struct SERVER_INFO_1557 i1557; 156 struct SERVER_INFO_1560 i1560; 157 struct SERVER_INFO_1561 i1561; 158 struct SERVER_INFO_1562 i1562; 159 struct SERVER_INFO_1563 i1563; 160 struct SERVER_INFO_1564 i1564; 161 struct SERVER_INFO_1565 i1565; 162 struct SERVER_INFO_1566 i1566; 163 struct SERVER_INFO_1567 i1567; 164 struct SERVER_INFO_1568 i1568; 165 struct SERVER_INFO_1569 i1569; 166 struct SERVER_INFO_1570 i1570; 167 struct SERVER_INFO_1571 i1571; 168 struct SERVER_INFO_1572 i1572; 169 struct SERVER_INFO_1573 i1573; 170 struct SERVER_INFO_1574 i1574; 171 struct SERVER_INFO_1575 i1575; 172 struct SERVER_INFO_1576 i1576; 173 struct SERVER_INFO_1577 i1577; 174 struct SERVER_INFO_1578 i1578; 175 struct SERVER_INFO_1579 i1579; 176 struct SERVER_INFO_1580 i1580; 177 struct SERVER_INFO_1581 i1581; 178 struct SERVER_INFO_1582 i1582; 179 struct SERVER_INFO_1583 i1583; 180 struct SERVER_INFO_1584 i1584; 181 struct SERVER_INFO_1585 i1585; 182 struct SERVER_INFO_1586 i1586; 183 struct SERVER_INFO_1587 i1587; 184 struct SERVER_INFO_1588 i1588; 185 struct SERVER_INFO_1590 i1590; 186 struct SERVER_INFO_1591 i1591; 187 struct SERVER_INFO_1592 i1592; 188 struct SERVER_INFO_1593 i1593; 189 struct SERVER_INFO_1594 i1594; 190 struct SERVER_INFO_1595 i1595; 191 struct SERVER_INFO_1596 i1596; 192 struct SERVER_INFO_1597 i1597; 193 struct SERVER_INFO_1598 i1598; 194 struct SERVER_INFO_1599 i1599; 195 struct SERVER_INFO_1600 i1600; 196 struct SERVER_INFO_1601 i1601; 197 struct SERVER_INFO_1602 i1602; 198#endif 199 uint32_t num_info = 0; 200 201 switch (level) { 202 case 100: 203 i100.sv100_platform_id = i->info100->platform_id; 204 i100.sv100_name = talloc_strdup(mem_ctx, i->info100->server_name); 205 206 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_100, i100, 207 (struct SERVER_INFO_100 **)buffer, 208 &num_info); 209 break; 210 211 case 101: 212 i101.sv101_platform_id = i->info101->platform_id; 213 i101.sv101_name = talloc_strdup(mem_ctx, i->info101->server_name); 214 i101.sv101_version_major = i->info101->version_major; 215 i101.sv101_version_minor = i->info101->version_minor; 216 i101.sv101_type = i->info101->server_type; 217 i101.sv101_comment = talloc_strdup(mem_ctx, i->info101->comment); 218 219 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_101, i101, 220 (struct SERVER_INFO_101 **)buffer, 221 &num_info); 222 break; 223 224 case 102: 225 i102.sv102_platform_id = i->info102->platform_id; 226 i102.sv102_name = talloc_strdup(mem_ctx, i->info102->server_name); 227 i102.sv102_version_major = i->info102->version_major; 228 i102.sv102_version_minor = i->info102->version_minor; 229 i102.sv102_type = i->info102->server_type; 230 i102.sv102_comment = talloc_strdup(mem_ctx, i->info102->comment); 231 i102.sv102_users = i->info102->users; 232 i102.sv102_disc = i->info102->disc; 233 i102.sv102_hidden = i->info102->hidden; 234 i102.sv102_announce = i->info102->announce; 235 i102.sv102_anndelta = i->info102->anndelta; 236 i102.sv102_licenses = i->info102->licenses; 237 i102.sv102_userpath = talloc_strdup(mem_ctx, i->info102->userpath); 238 239 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_102, i102, 240 (struct SERVER_INFO_102 **)buffer, 241 &num_info); 242 break; 243 244 case 402: 245 246 i402.sv402_ulist_mtime = i->info402->ulist_mtime; 247 i402.sv402_glist_mtime = i->info402->glist_mtime; 248 i402.sv402_alist_mtime = i->info402->alist_mtime; 249 i402.sv402_alerts = talloc_strdup(mem_ctx, i->info402->alerts); 250 i402.sv402_security = i->info402->security; 251 i402.sv402_numadmin = i->info402->numadmin; 252 i402.sv402_lanmask = i->info402->lanmask; 253 i402.sv402_guestacct = talloc_strdup(mem_ctx, i->info402->guestaccount); 254 i402.sv402_chdevs = i->info402->chdevs; 255 i402.sv402_chdevq = i->info402->chdevqs; 256 i402.sv402_chdevjobs = i->info402->chdevjobs; 257 i402.sv402_connections = i->info402->connections; 258 i402.sv402_shares = i->info402->shares; 259 i402.sv402_openfiles = i->info402->openfiles; 260 i402.sv402_sessopens = i->info402->sessopen; 261 i402.sv402_sessvcs = i->info402->sesssvc; 262 i402.sv402_sessreqs = i->info402->sessreqs; 263 i402.sv402_opensearch = i->info402->opensearch; 264 i402.sv402_activelocks = i->info402->activelocks; 265 i402.sv402_numreqbuf = i->info402->numreqbufs; 266 i402.sv402_sizreqbuf = i->info402->sizereqbufs; 267 i402.sv402_numbigbuf = i->info402->numbigbufs; 268 i402.sv402_numfiletasks = i->info402->numfiletasks; 269 i402.sv402_alertsched = i->info402->alertsched; 270 i402.sv402_erroralert = i->info402->erroralert; 271 i402.sv402_logonalert = i->info402->logonalert; 272 i402.sv402_accessalert = i->info402->accessalert; 273 i402.sv402_diskalert = i->info402->diskalert; 274 i402.sv402_netioalert = i->info402->netioalert; 275 i402.sv402_maxauditsz = i->info402->maxaudits; 276 i402.sv402_srvheuristics = i->info402->srvheuristics; 277 278 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_402, i402, 279 (struct SERVER_INFO_402 **)buffer, 280 &num_info); 281 break; 282 283 case 403: 284 285 i403.sv403_ulist_mtime = i->info403->ulist_mtime; 286 i403.sv403_glist_mtime = i->info403->glist_mtime; 287 i403.sv403_alist_mtime = i->info403->alist_mtime; 288 i403.sv403_alerts = talloc_strdup(mem_ctx, i->info403->alerts); 289 i403.sv403_security = i->info403->security; 290 i403.sv403_numadmin = i->info403->numadmin; 291 i403.sv403_lanmask = i->info403->lanmask; 292 i403.sv403_guestacct = talloc_strdup(mem_ctx, i->info403->guestaccount); 293 i403.sv403_chdevs = i->info403->chdevs; 294 i403.sv403_chdevq = i->info403->chdevqs; 295 i403.sv403_chdevjobs = i->info403->chdevjobs; 296 i403.sv403_connections = i->info403->connections; 297 i403.sv403_shares = i->info403->shares; 298 i403.sv403_openfiles = i->info403->openfiles; 299 i403.sv403_sessopens = i->info403->sessopen; 300 i403.sv403_sessvcs = i->info403->sesssvc; 301 i403.sv403_sessreqs = i->info403->sessreqs; 302 i403.sv403_opensearch = i->info403->opensearch; 303 i403.sv403_activelocks = i->info403->activelocks; 304 i403.sv403_numreqbuf = i->info403->numreqbufs; 305 i403.sv403_sizreqbuf = i->info403->sizereqbufs; 306 i403.sv403_numbigbuf = i->info403->numbigbufs; 307 i403.sv403_numfiletasks = i->info403->numfiletasks; 308 i403.sv403_alertsched = i->info403->alertsched; 309 i403.sv403_erroralert = i->info403->erroralert; 310 i403.sv403_logonalert = i->info403->logonalert; 311 i403.sv403_accessalert = i->info403->accessalert; 312 i403.sv403_diskalert = i->info403->diskalert; 313 i403.sv403_netioalert = i->info403->netioalert; 314 i403.sv403_maxauditsz = i->info403->maxaudits; 315 i403.sv403_srvheuristics = i->info403->srvheuristics; 316 i403.sv403_auditedevents = i->info403->auditedevents; 317 i403.sv403_autoprofile = i->info403->auditprofile; 318 i403.sv403_autopath = talloc_strdup(mem_ctx, i->info403->autopath); 319 320 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_403, i403, 321 (struct SERVER_INFO_403 **)buffer, 322 &num_info); 323 break; 324 325 case 502: 326 i502.sv502_sessopens = i->info502->sessopen; 327 i502.sv502_sessvcs = i->info502->sesssvc; 328 i502.sv502_opensearch = i->info502->opensearch; 329 i502.sv502_sizreqbuf = i->info502->sizereqbufs; 330 i502.sv502_initworkitems = i->info502->initworkitems; 331 i502.sv502_maxworkitems = i->info502->maxworkitems; 332 i502.sv502_rawworkitems = i->info502->rawworkitems; 333 i502.sv502_irpstacksize = i->info502->irpstacksize; 334 i502.sv502_maxrawbuflen = i->info502->maxrawbuflen; 335 i502.sv502_sessusers = i->info502->sessusers; 336 i502.sv502_sessconns = i->info502->sessconns; 337 i502.sv502_maxpagedmemoryusage = i->info502->maxpagedmemoryusage; 338 i502.sv502_maxnonpagedmemoryusage = i->info502->maxnonpagedmemoryusage; 339 i502.sv502_enablesoftcompat = i->info502->enablesoftcompat; 340 i502.sv502_enableforcedlogoff = i->info502->enableforcedlogoff; 341 i502.sv502_timesource = i->info502->timesource; 342 i502.sv502_acceptdownlevelapis = i->info502->acceptdownlevelapis; 343 i502.sv502_lmannounce = i->info502->lmannounce; 344 345 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_502, i502, 346 (struct SERVER_INFO_502 **)buffer, 347 &num_info); 348 break; 349 350 case 503: 351 i503.sv503_sessopens = i->info503->sessopen; 352 i503.sv503_sessvcs = i->info503->sesssvc; 353 i503.sv503_opensearch = i->info503->opensearch; 354 i503.sv503_sizreqbuf = i->info503->sizereqbufs; 355 i503.sv503_initworkitems = i->info503->initworkitems; 356 i503.sv503_maxworkitems = i->info503->maxworkitems; 357 i503.sv503_rawworkitems = i->info503->rawworkitems; 358 i503.sv503_irpstacksize = i->info503->irpstacksize; 359 i503.sv503_maxrawbuflen = i->info503->maxrawbuflen; 360 i503.sv503_sessusers = i->info503->sessusers; 361 i503.sv503_sessconns = i->info503->sessconns; 362 i503.sv503_maxpagedmemoryusage = i->info503->maxpagedmemoryusage; 363 i503.sv503_maxnonpagedmemoryusage = i->info503->maxnonpagedmemoryusage; 364 i503.sv503_enablesoftcompat = i->info503->enablesoftcompat; 365 i503.sv503_enableforcedlogoff = i->info503->enableforcedlogoff; 366 i503.sv503_timesource = i->info503->timesource; 367 i503.sv503_acceptdownlevelapis = i->info503->acceptdownlevelapis; 368 i503.sv503_lmannounce = i->info503->lmannounce; 369 i503.sv503_domain = talloc_strdup(mem_ctx, i->info503->domain); 370 i503.sv503_maxcopyreadlen = i->info503->maxcopyreadlen; 371 i503.sv503_maxcopywritelen = i->info503->maxcopywritelen; 372 i503.sv503_minkeepsearch = i->info503->minkeepsearch; 373 i503.sv503_maxkeepsearch = i->info503->maxkeepsearch; 374 i503.sv503_minkeepcomplsearch = i->info503->minkeepcomplsearch; 375 i503.sv503_maxkeepcomplsearch = i->info503->maxkeepcomplsearch; 376 i503.sv503_threadcountadd = i->info503->threadcountadd; 377 i503.sv503_numblockthreads = i->info503->numlockthreads; 378 i503.sv503_scavtimeout = i->info503->scavtimeout; 379 i503.sv503_minrcvqueue = i->info503->minrcvqueue; 380 i503.sv503_minfreeworkitems = i->info503->minfreeworkitems; 381 i503.sv503_xactmemsize = i->info503->xactmemsize; 382 i503.sv503_threadpriority = i->info503->threadpriority; 383 i503.sv503_maxmpxct = i->info503->maxmpxct; 384 i503.sv503_oplockbreakwait = i->info503->oplockbreakwait; 385 i503.sv503_oplockbreakresponsewait = i->info503->oplockbreakresponsewait; 386 i503.sv503_enableoplocks = i->info503->enableoplocks; 387 i503.sv503_enableoplockforceclose = i->info503->enableoplockforceclose; 388 i503.sv503_enablefcbopens = i->info503->enablefcbopens; 389 i503.sv503_enableraw = i->info503->enableraw; 390 i503.sv503_enablesharednetdrives = i->info503->enablesharednetdrives; 391 i503.sv503_minfreeconnections = i->info503->minfreeconnections; 392 i503.sv503_maxfreeconnections = i->info503->maxfreeconnections; 393 394 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_503, i503, 395 (struct SERVER_INFO_503 **)buffer, 396 &num_info); 397 break; 398 399 case 599: 400 i599.sv599_sessopens = i->info599->sessopen; 401 i599.sv599_sessvcs = i->info599->sesssvc; 402 i599.sv599_opensearch = i->info599->opensearch; 403 i599.sv599_sizreqbuf = i->info599->sizereqbufs; 404 i599.sv599_initworkitems = i->info599->initworkitems; 405 i599.sv599_maxworkitems = i->info599->maxworkitems; 406 i599.sv599_rawworkitems = i->info599->rawworkitems; 407 i599.sv599_irpstacksize = i->info599->irpstacksize; 408 i599.sv599_maxrawbuflen = i->info599->maxrawbuflen; 409 i599.sv599_sessusers = i->info599->sessusers; 410 i599.sv599_sessconns = i->info599->sessconns; 411 i599.sv599_maxpagedmemoryusage = i->info599->maxpagedmemoryusage; 412 i599.sv599_maxnonpagedmemoryusage = i->info599->maxnonpagedmemoryusage; 413 i599.sv599_enablesoftcompat = i->info599->enablesoftcompat; 414 i599.sv599_enableforcedlogoff = i->info599->enableforcedlogoff; 415 i599.sv599_timesource = i->info599->timesource; 416 i599.sv599_acceptdownlevelapis = i->info599->acceptdownlevelapis; 417 i599.sv599_lmannounce = i->info599->lmannounce; 418 i599.sv599_domain = talloc_strdup(mem_ctx, i->info599->domain); 419 i599.sv599_maxcopyreadlen = i->info599->maxcopyreadlen; 420 i599.sv599_maxcopywritelen = i->info599->maxcopywritelen; 421 i599.sv599_minkeepsearch = i->info599->minkeepsearch; 422 i599.sv599_maxkeepsearch = 0; /* ?? */ 423 i599.sv599_minkeepcomplsearch = i->info599->minkeepcomplsearch; 424 i599.sv599_maxkeepcomplsearch = i->info599->maxkeepcomplsearch; 425 i599.sv599_threadcountadd = i->info599->threadcountadd; 426 i599.sv599_numblockthreads = i->info599->numlockthreads; /* typo ? */ 427 i599.sv599_scavtimeout = i->info599->scavtimeout; 428 i599.sv599_minrcvqueue = i->info599->minrcvqueue; 429 i599.sv599_minfreeworkitems = i->info599->minfreeworkitems; 430 i599.sv599_xactmemsize = i->info599->xactmemsize; 431 i599.sv599_threadpriority = i->info599->threadpriority; 432 i599.sv599_maxmpxct = i->info599->maxmpxct; 433 i599.sv599_oplockbreakwait = i->info599->oplockbreakwait; 434 i599.sv599_oplockbreakresponsewait = i->info599->oplockbreakresponsewait; 435 i599.sv599_enableoplocks = i->info599->enableoplocks; 436 i599.sv599_enableoplockforceclose = i->info599->enableoplockforceclose; 437 i599.sv599_enablefcbopens = i->info599->enablefcbopens; 438 i599.sv599_enableraw = i->info599->enableraw; 439 i599.sv599_enablesharednetdrives = i->info599->enablesharednetdrives; 440 i599.sv599_minfreeconnections = i->info599->minfreeconnections; 441 i599.sv599_maxfreeconnections = i->info599->maxfreeconnections; 442 i599.sv599_initsesstable = i->info599->initsesstable; 443 i599.sv599_initconntable = i->info599->initconntable; 444 i599.sv599_initfiletable = i->info599->initfiletable; 445 i599.sv599_initsearchtable = i->info599->initsearchtable; 446 i599.sv599_alertschedule = i->info599->alertsched; 447 i599.sv599_errorthreshold = i->info599->errortreshold; 448 i599.sv599_networkerrorthreshold = i->info599->networkerrortreshold; 449 i599.sv599_diskspacethreshold = i->info599->diskspacetreshold; 450 i599.sv599_reserved = i->info599->reserved; 451 i599.sv599_maxlinkdelay = i->info599->maxlinkdelay; 452 i599.sv599_minlinkthroughput = i->info599->minlinkthroughput; 453 i599.sv599_linkinfovalidtime = i->info599->linkinfovalidtime; 454 i599.sv599_scavqosinfoupdatetime = i->info599->scavqosinfoupdatetime; 455 i599.sv599_maxworkitemidletime = i->info599->maxworkitemidletime; 456 457 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_599, i599, 458 (struct SERVER_INFO_599 **)buffer, 459 &num_info); 460 break; 461 462 case 1005: 463 i1005.sv1005_comment = talloc_strdup(mem_ctx, i->info1005->comment); 464 465 ADD_TO_ARRAY(mem_ctx, struct SERVER_INFO_1005, i1005, 466 (struct SERVER_INFO_1005 **)buffer, 467 &num_info); 468 break; 469 default: 470 return NT_STATUS_NOT_SUPPORTED; 471 } 472 473 return NT_STATUS_OK; 474} 475 476/**************************************************************** 477****************************************************************/ 478 479WERROR NetServerGetInfo_r(struct libnetapi_ctx *ctx, 480 struct NetServerGetInfo *r) 481{ 482 struct rpc_pipe_client *pipe_cli = NULL; 483 NTSTATUS status; 484 WERROR werr; 485 union srvsvc_NetSrvInfo info; 486 487 if (!r->out.buffer) { 488 return WERR_INVALID_PARAM; 489 } 490 491 switch (r->in.level) { 492 case 100: 493 case 101: 494 case 102: 495 case 402: 496 case 502: 497 case 503: 498 case 1005: 499 break; 500 default: 501 return WERR_UNKNOWN_LEVEL; 502 } 503 504 werr = libnetapi_open_pipe(ctx, r->in.server_name, 505 &ndr_table_srvsvc.syntax_id, 506 &pipe_cli); 507 if (!W_ERROR_IS_OK(werr)) { 508 goto done; 509 } 510 511 status = rpccli_srvsvc_NetSrvGetInfo(pipe_cli, talloc_tos(), 512 r->in.server_name, 513 r->in.level, 514 &info, 515 &werr); 516 if (!NT_STATUS_IS_OK(status)) { 517 werr = ntstatus_to_werror(status); 518 goto done; 519 } 520 521 status = map_server_info_to_SERVER_INFO_buffer(ctx, r->in.level, &info, 522 r->out.buffer); 523 if (!NT_STATUS_IS_OK(status)) { 524 werr = ntstatus_to_werror(status); 525 goto done; 526 } 527 528 done: 529 return werr; 530} 531 532/**************************************************************** 533****************************************************************/ 534 535static WERROR NetServerSetInfo_l_1005(struct libnetapi_ctx *ctx, 536 struct NetServerSetInfo *r) 537{ 538 WERROR werr; 539 struct smbconf_ctx *conf_ctx; 540 struct srvsvc_NetSrvInfo1005 *info1005; 541 542 if (!r->in.buffer) { 543 *r->out.parm_error = 1005; /* sure here ? */ 544 return WERR_INVALID_PARAM; 545 } 546 547 info1005 = (struct srvsvc_NetSrvInfo1005 *)r->in.buffer; 548 549 if (!info1005->comment) { 550 *r->out.parm_error = 1005; 551 return WERR_INVALID_PARAM; 552 } 553 554 if (!lp_config_backend_is_registry()) { 555 libnetapi_set_error_string(ctx, 556 "Configuration manipulation requested but not " 557 "supported by backend"); 558 return WERR_NOT_SUPPORTED; 559 } 560 561 werr = smbconf_init_reg(ctx, &conf_ctx, NULL); 562 if (!W_ERROR_IS_OK(werr)) { 563 goto done; 564 } 565 566 werr = smbconf_set_global_parameter(conf_ctx, "server string", 567 info1005->comment); 568 569 done: 570 smbconf_shutdown(conf_ctx); 571 return werr; 572} 573 574/**************************************************************** 575****************************************************************/ 576 577WERROR NetServerSetInfo_l(struct libnetapi_ctx *ctx, 578 struct NetServerSetInfo *r) 579{ 580 switch (r->in.level) { 581 case 1005: 582 return NetServerSetInfo_l_1005(ctx, r); 583 default: 584 break; 585 } 586 587 return WERR_UNKNOWN_LEVEL; 588} 589 590/**************************************************************** 591****************************************************************/ 592 593WERROR NetServerSetInfo_r(struct libnetapi_ctx *ctx, 594 struct NetServerSetInfo *r) 595{ 596 struct rpc_pipe_client *pipe_cli = NULL; 597 NTSTATUS status; 598 WERROR werr; 599 union srvsvc_NetSrvInfo info; 600 601 werr = libnetapi_open_pipe(ctx, r->in.server_name, 602 &ndr_table_srvsvc.syntax_id, 603 &pipe_cli); 604 if (!W_ERROR_IS_OK(werr)) { 605 goto done; 606 } 607 608 switch (r->in.level) { 609 case 1005: 610 info.info1005 = (struct srvsvc_NetSrvInfo1005 *)r->in.buffer; 611 break; 612 default: 613 werr = WERR_NOT_SUPPORTED; 614 goto done; 615 } 616 617 status = rpccli_srvsvc_NetSrvSetInfo(pipe_cli, talloc_tos(), 618 r->in.server_name, 619 r->in.level, 620 &info, 621 r->out.parm_error, 622 &werr); 623 if (!NT_STATUS_IS_OK(status)) { 624 werr = ntstatus_to_werror(status); 625 goto done; 626 } 627 628 done: 629 return werr; 630} 631 632/**************************************************************** 633****************************************************************/ 634 635WERROR NetRemoteTOD_r(struct libnetapi_ctx *ctx, 636 struct NetRemoteTOD *r) 637{ 638 struct rpc_pipe_client *pipe_cli = NULL; 639 NTSTATUS status; 640 WERROR werr; 641 struct srvsvc_NetRemoteTODInfo *info = NULL; 642 643 werr = libnetapi_open_pipe(ctx, r->in.server_name, 644 &ndr_table_srvsvc.syntax_id, 645 &pipe_cli); 646 if (!W_ERROR_IS_OK(werr)) { 647 goto done; 648 } 649 650 status = rpccli_srvsvc_NetRemoteTOD(pipe_cli, talloc_tos(), 651 r->in.server_name, 652 &info, 653 &werr); 654 if (!NT_STATUS_IS_OK(status)) { 655 werr = ntstatus_to_werror(status); 656 goto done; 657 } 658 659 *r->out.buffer = (uint8_t *)talloc_memdup(ctx, info, 660 sizeof(struct srvsvc_NetRemoteTODInfo)); 661 W_ERROR_HAVE_NO_MEMORY(*r->out.buffer); 662 663 done: 664 return werr; 665} 666 667/**************************************************************** 668****************************************************************/ 669 670WERROR NetRemoteTOD_l(struct libnetapi_ctx *ctx, 671 struct NetRemoteTOD *r) 672{ 673 LIBNETAPI_REDIRECT_TO_LOCALHOST(ctx, r, NetRemoteTOD); 674} 675 676