1 1.21 sevan /* $NetBSD: ypxfr.c,v 1.21 2017/05/04 16:26:10 sevan Exp $ */ 2 1.1 thorpej 3 1.1 thorpej /* 4 1.1 thorpej * Copyright (c) 1994 Mats O Jansson <moj (at) stacken.kth.se> 5 1.1 thorpej * All rights reserved. 6 1.1 thorpej * 7 1.1 thorpej * Redistribution and use in source and binary forms, with or without 8 1.1 thorpej * modification, are permitted provided that the following conditions 9 1.1 thorpej * are met: 10 1.1 thorpej * 1. Redistributions of source code must retain the above copyright 11 1.1 thorpej * notice, this list of conditions and the following disclaimer. 12 1.1 thorpej * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 thorpej * notice, this list of conditions and the following disclaimer in the 14 1.1 thorpej * documentation and/or other materials provided with the distribution. 15 1.1 thorpej * 16 1.1 thorpej * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 17 1.1 thorpej * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 1.1 thorpej * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 1.1 thorpej * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 20 1.1 thorpej * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 1.1 thorpej * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22 1.1 thorpej * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23 1.1 thorpej * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24 1.1 thorpej * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25 1.1 thorpej * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 1.1 thorpej * SUCH DAMAGE. 27 1.1 thorpej */ 28 1.6 lukem 29 1.6 lukem #include <sys/cdefs.h> 30 1.6 lukem #ifndef lint 31 1.21 sevan __RCSID("$NetBSD: ypxfr.c,v 1.21 2017/05/04 16:26:10 sevan Exp $"); 32 1.6 lukem #endif 33 1.1 thorpej 34 1.15 lukem #include <sys/param.h> 35 1.1 thorpej #include <sys/types.h> 36 1.1 thorpej #include <sys/stat.h> 37 1.1 thorpej #include <sys/socket.h> 38 1.1 thorpej 39 1.1 thorpej #include <netinet/in.h> 40 1.1 thorpej #include <arpa/inet.h> 41 1.1 thorpej 42 1.4 thorpej #include <err.h> 43 1.1 thorpej #include <netdb.h> 44 1.1 thorpej #include <string.h> 45 1.1 thorpej #include <stdio.h> 46 1.1 thorpej #include <stdlib.h> 47 1.8 thorpej #include <syslog.h> 48 1.1 thorpej #include <unistd.h> 49 1.1 thorpej 50 1.1 thorpej #include <rpc/rpc.h> 51 1.1 thorpej #include <rpc/xdr.h> 52 1.1 thorpej #include <rpcsvc/yp_prot.h> 53 1.1 thorpej #include <rpcsvc/ypclnt.h> 54 1.1 thorpej 55 1.1 thorpej #include "yplib_host.h" 56 1.1 thorpej #include "ypdb.h" 57 1.1 thorpej #include "ypdef.h" 58 1.1 thorpej 59 1.1 thorpej DBM *db; 60 1.1 thorpej 61 1.18 chuck static int yperr2yppush(int); 62 1.12 wiz static int ypxfr_foreach(int, char *, int, char *, int, char *); 63 1.1 thorpej 64 1.12 wiz int get_local_ordernum(char *, char *, u_int *); 65 1.12 wiz int get_remote_ordernum(CLIENT *, char *, char *, u_int, u_int *); 66 1.12 wiz void get_map(CLIENT *, char *, char *, struct ypall_callback *); 67 1.15 lukem DBM *create_db(char *, char *, char *, size_t); 68 1.12 wiz int install_db(char *, char *, char *); 69 1.12 wiz int unlink_db(char *, char *, char *); 70 1.12 wiz int add_order(DBM *, u_int); 71 1.12 wiz int add_master(CLIENT *, char *, char *, DBM *); 72 1.12 wiz int add_interdomain(CLIENT *, char *, char *, DBM *); 73 1.12 wiz int add_secure(CLIENT *, char *, char *, DBM *); 74 1.12 wiz int send_clear(CLIENT *); 75 1.12 wiz int send_reply(CLIENT *, int, int); 76 1.12 wiz 77 1.12 wiz int 78 1.12 wiz main(int argc, char **argv) 79 1.1 thorpej { 80 1.1 thorpej int need_usage = 0, cflag = 0, fflag = 0, Cflag = 0; 81 1.1 thorpej int ch; 82 1.1 thorpej char *domain; 83 1.1 thorpej char *host = NULL; 84 1.1 thorpej char *srcdomain = NULL; 85 1.1 thorpej char *tid = NULL; 86 1.1 thorpej char *prog = NULL; 87 1.1 thorpej char *ipadd = NULL; 88 1.1 thorpej char *port = NULL; 89 1.1 thorpej char *map = NULL; 90 1.1 thorpej u_int ordernum, new_ordernum; 91 1.1 thorpej struct ypall_callback callback; 92 1.1 thorpej CLIENT *client; 93 1.15 lukem char temp_map[MAXPATHLEN]; 94 1.1 thorpej int status, xfr_status; 95 1.1 thorpej 96 1.1 thorpej status = YPPUSH_SUCC; 97 1.1 thorpej client = NULL; 98 1.1 thorpej 99 1.1 thorpej if (yp_get_default_domain(&domain)) 100 1.1 thorpej errx(1, "can't get YP domain name"); 101 1.1 thorpej 102 1.1 thorpej while ((ch = getopt(argc, argv, "cd:fh:s:C:")) != -1) { 103 1.1 thorpej switch (ch) { 104 1.1 thorpej case 'c': 105 1.1 thorpej cflag = 1; 106 1.1 thorpej break; 107 1.1 thorpej 108 1.1 thorpej case 'd': 109 1.1 thorpej domain = optarg; 110 1.1 thorpej break; 111 1.1 thorpej 112 1.1 thorpej case 'f': 113 1.1 thorpej fflag = 1; 114 1.1 thorpej break; 115 1.1 thorpej 116 1.1 thorpej case 'h': 117 1.1 thorpej host = optarg; 118 1.1 thorpej break; 119 1.1 thorpej 120 1.1 thorpej case 's': 121 1.1 thorpej srcdomain = optarg; 122 1.1 thorpej break; 123 1.1 thorpej 124 1.1 thorpej case 'C': 125 1.2 chuck if (optind + 3 >= argc) { 126 1.2 chuck need_usage = 1; 127 1.2 chuck optind = argc; 128 1.2 chuck break; 129 1.2 chuck } 130 1.1 thorpej Cflag = 1; 131 1.1 thorpej tid = optarg; 132 1.1 thorpej prog = argv[optind++]; 133 1.1 thorpej ipadd = argv[optind++]; 134 1.1 thorpej port = argv[optind++]; 135 1.1 thorpej break; 136 1.1 thorpej 137 1.1 thorpej default: 138 1.1 thorpej need_usage = 1; 139 1.1 thorpej } 140 1.1 thorpej } 141 1.1 thorpej argc -= optind; argv += optind; 142 1.1 thorpej 143 1.1 thorpej if (argc != 1) 144 1.1 thorpej need_usage = 1; 145 1.1 thorpej 146 1.1 thorpej map = argv[0]; 147 1.1 thorpej 148 1.1 thorpej if (need_usage) { 149 1.1 thorpej status = YPPUSH_BADARGS; 150 1.20 wiz fprintf(stderr, "usage: %s [-cf] [-C tid prog ipadd port] " 151 1.20 wiz "[-d domain] [-h host] [-s domain] mapname\n", 152 1.20 wiz getprogname()); 153 1.18 chuck exit(1); 154 1.1 thorpej } 155 1.1 thorpej 156 1.8 thorpej #ifdef DEBUG 157 1.10 lukem openlog("ypxfr", LOG_PID, LOG_DAEMON); 158 1.1 thorpej 159 1.8 thorpej syslog(LOG_DEBUG, "ypxfr: Arguments:"); 160 1.8 thorpej syslog(LOG_DEBUG, "YP clear to local: %s", (cflag) ? "no" : "yes"); 161 1.8 thorpej syslog(LOG_DEBUG, " Force transfer: %s", (fflag) ? "yes" : "no"); 162 1.8 thorpej syslog(LOG_DEBUG, " domain: %s", domain); 163 1.8 thorpej syslog(LOG_DEBUG, " host: %s", host); 164 1.8 thorpej syslog(LOG_DEBUG, " source domain: %s", srcdomain); 165 1.8 thorpej syslog(LOG_DEBUG, " transid: %s", tid); 166 1.8 thorpej syslog(LOG_DEBUG, " prog: %s", prog); 167 1.8 thorpej syslog(LOG_DEBUG, " port: %s", port); 168 1.8 thorpej syslog(LOG_DEBUG, " ipadd: %s", ipadd); 169 1.8 thorpej syslog(LOG_DEBUG, " map: %s", map); 170 1.8 thorpej #endif 171 1.1 thorpej 172 1.1 thorpej if (fflag != 0) 173 1.1 thorpej ordernum = 0; 174 1.1 thorpej else { 175 1.1 thorpej status = get_local_ordernum(domain, map, &ordernum); 176 1.1 thorpej if (status < 0) 177 1.1 thorpej goto punt; 178 1.1 thorpej } 179 1.1 thorpej 180 1.10 lukem #ifdef DEBUG 181 1.8 thorpej syslog(LOG_DEBUG, "Get Master"); 182 1.10 lukem #endif 183 1.1 thorpej 184 1.1 thorpej if (host == NULL) { 185 1.1 thorpej if (srcdomain == NULL) 186 1.5 lukem status = yp_master(domain, map, &host); 187 1.1 thorpej else 188 1.5 lukem status = yp_master(srcdomain, map, &host); 189 1.1 thorpej 190 1.1 thorpej if (status == 0) 191 1.1 thorpej status = YPPUSH_SUCC; 192 1.1 thorpej else { 193 1.18 chuck status = YPPUSH_MADDR; 194 1.1 thorpej goto punt; 195 1.1 thorpej } 196 1.1 thorpej } 197 1.1 thorpej 198 1.10 lukem #ifdef DEBUG 199 1.8 thorpej syslog(LOG_DEBUG, "Connect host: %s", host); 200 1.10 lukem #endif 201 1.1 thorpej 202 1.5 lukem client = yp_bind_host(host, YPPROG, YPVERS, 0, 1); 203 1.1 thorpej 204 1.5 lukem status = get_remote_ordernum(client, domain, map, ordernum, 205 1.5 lukem &new_ordernum); 206 1.1 thorpej 207 1.1 thorpej 208 1.1 thorpej if (status == YPPUSH_SUCC) { 209 1.1 thorpej /* Create temporary db */ 210 1.15 lukem db = create_db(domain, map, temp_map, sizeof(temp_map)); 211 1.1 thorpej if (db == NULL) 212 1.1 thorpej status = YPPUSH_DBM; 213 1.1 thorpej 214 1.1 thorpej /* Add ORDER */ 215 1.1 thorpej if (status > 0) 216 1.1 thorpej status = add_order(db, new_ordernum); 217 1.1 thorpej 218 1.1 thorpej /* Add MASTER */ 219 1.1 thorpej if (status > 0) 220 1.1 thorpej status = add_master(client, domain, map, db); 221 1.1 thorpej 222 1.1 thorpej /* Add INTERDOMAIN */ 223 1.1 thorpej if (status > 0) 224 1.1 thorpej status = add_interdomain(client, domain, map, db); 225 1.1 thorpej 226 1.1 thorpej /* Add SECURE */ 227 1.1 thorpej if (status > 0) 228 1.1 thorpej status = add_secure(client, domain, map, db); 229 1.1 thorpej 230 1.1 thorpej if (status > 0) { 231 1.4 thorpej callback.foreach = ypxfr_foreach; 232 1.1 thorpej get_map(client, domain, map, &callback); 233 1.1 thorpej } 234 1.1 thorpej 235 1.1 thorpej /* Close db */ 236 1.1 thorpej if (db != NULL) 237 1.1 thorpej ypdb_close(db); 238 1.1 thorpej 239 1.1 thorpej /* Rename db */ 240 1.1 thorpej if (status > 0) 241 1.15 lukem status = install_db(domain, map, temp_map); 242 1.1 thorpej else 243 1.19 chuck (void) unlink_db(domain, map, temp_map); 244 1.1 thorpej } 245 1.1 thorpej 246 1.1 thorpej punt: 247 1.1 thorpej xfr_status = status; 248 1.1 thorpej 249 1.1 thorpej if (client != NULL) 250 1.1 thorpej clnt_destroy(client); 251 1.1 thorpej 252 1.1 thorpej /* YP_CLEAR */ 253 1.1 thorpej if (!cflag) { 254 1.1 thorpej client = yp_bind_local(YPPROG, YPVERS); 255 1.1 thorpej status = send_clear(client); 256 1.1 thorpej clnt_destroy(client); 257 1.1 thorpej } 258 1.1 thorpej 259 1.1 thorpej if (Cflag > 0) { 260 1.1 thorpej /* Send Response */ 261 1.1 thorpej client = yp_bind_host(ipadd, atoi(prog), 1, atoi(port), 0); 262 1.1 thorpej status = send_reply(client, xfr_status, atoi(tid)); 263 1.1 thorpej clnt_destroy(client); 264 1.1 thorpej } 265 1.1 thorpej 266 1.1 thorpej exit (0); 267 1.1 thorpej } 268 1.1 thorpej 269 1.18 chuck /* 270 1.18 chuck * yperr2yppush: convert error codes from functions like yp_order_host, 271 1.18 chuck * yp_master_host, and yp_match_host into YPPUSH rpc status values. 272 1.18 chuck */ 273 1.18 chuck static int 274 1.18 chuck yperr2yppush(int yperr) { 275 1.18 chuck switch (yperr) { 276 1.18 chuck case YPERR_DOMAIN: 277 1.18 chuck return(YPPUSH_NODOM); 278 1.18 chuck case YPERR_MAP: 279 1.18 chuck return(YPPUSH_NOMAP); 280 1.18 chuck case YPERR_KEY: 281 1.18 chuck return(YPPUSH_YPERR); 282 1.18 chuck case YPERR_BADDB: 283 1.18 chuck return(YPPUSH_YPERR); 284 1.18 chuck } 285 1.18 chuck 286 1.18 chuck /* 287 1.18 chuck * generic error status for the rest (BADARGS, RPC, YPERR, RESRC, 288 1.18 chuck * NOMORE, PMAP, YPBIND, YPSERV, NODOM, VERS, ACCESS, BUSY) 289 1.18 chuck */ 290 1.18 chuck return(YPPUSH_XFRERR); /* generic error status */ 291 1.18 chuck } 292 1.18 chuck 293 1.1 thorpej static int 294 1.12 wiz ypxfr_foreach(int status, char *keystr, int keylen, char *valstr, 295 1.12 wiz int vallen, char *data) 296 1.1 thorpej { 297 1.1 thorpej datum key, val; 298 1.1 thorpej 299 1.1 thorpej if (status == YP_NOMORE) 300 1.1 thorpej return (0); 301 1.1 thorpej 302 1.1 thorpej keystr[keylen] = '\0'; 303 1.1 thorpej valstr[vallen] = '\0'; 304 1.1 thorpej 305 1.1 thorpej key.dptr = keystr; 306 1.1 thorpej key.dsize = strlen(keystr); 307 1.1 thorpej 308 1.1 thorpej val.dptr = valstr; 309 1.1 thorpej val.dsize = strlen(valstr); 310 1.1 thorpej 311 1.18 chuck /* XXX: suspect... ignoring return value here */ 312 1.1 thorpej ypdb_store(db, key, val, YPDB_INSERT); 313 1.1 thorpej 314 1.1 thorpej return (0); 315 1.1 thorpej } 316 1.1 thorpej 317 1.1 thorpej int 318 1.12 wiz get_local_ordernum(char *domain, char *map, u_int *lordernum) 319 1.1 thorpej { 320 1.1 thorpej char map_path[1024]; 321 1.1 thorpej char order_key[] = YP_LAST_KEY; 322 1.1 thorpej char order[MAX_LAST_LEN+1]; 323 1.1 thorpej struct stat finfo; 324 1.16 lukem DBM *ldb; 325 1.5 lukem datum k, v; 326 1.16 lukem unsigned int status; 327 1.1 thorpej 328 1.1 thorpej status = YPPUSH_SUCC; 329 1.1 thorpej 330 1.1 thorpej snprintf(map_path, sizeof(map_path), "%s/%s", YP_DB_PATH, domain); 331 1.1 thorpej 332 1.1 thorpej /* Make sure we serve the domain. */ 333 1.1 thorpej if ((stat(map_path, &finfo)) != 0 || 334 1.1 thorpej (S_ISDIR(finfo.st_mode) == 0)) { 335 1.4 thorpej warnx("domain `%s' not found locally", domain); 336 1.1 thorpej status = YPPUSH_NODOM; 337 1.1 thorpej goto out; 338 1.1 thorpej } 339 1.1 thorpej 340 1.1 thorpej /* Make sure we serve the map. */ 341 1.1 thorpej snprintf(map_path, sizeof(map_path), "%s/%s/%s%s", 342 1.1 thorpej YP_DB_PATH, domain, map, YPDB_SUFFIX); 343 1.1 thorpej if (stat(map_path, &finfo) != 0) { 344 1.1 thorpej status = YPPUSH_NOMAP; 345 1.1 thorpej goto out; 346 1.1 thorpej } 347 1.1 thorpej 348 1.1 thorpej /* Open the map file. */ 349 1.1 thorpej snprintf(map_path, sizeof(map_path), "%s/%s/%s", 350 1.1 thorpej YP_DB_PATH, domain, map); 351 1.16 lukem ldb = ypdb_open(map_path); 352 1.16 lukem if (ldb == NULL) { 353 1.1 thorpej status = YPPUSH_DBM; 354 1.1 thorpej goto out; 355 1.1 thorpej } 356 1.1 thorpej 357 1.1 thorpej k.dptr = (char *)&order_key; 358 1.1 thorpej k.dsize = YP_LAST_LEN; 359 1.1 thorpej 360 1.16 lukem v = ypdb_fetch(ldb, k); 361 1.1 thorpej 362 1.1 thorpej if (v.dptr == NULL) 363 1.1 thorpej *lordernum = 0; 364 1.1 thorpej else { 365 1.1 thorpej strncpy(order, v.dptr, v.dsize); 366 1.1 thorpej order[v.dsize] = '\0'; 367 1.1 thorpej *lordernum = (u_int)atoi((char *)&order); 368 1.1 thorpej } 369 1.16 lukem ypdb_close(ldb); 370 1.1 thorpej 371 1.1 thorpej out: 372 1.1 thorpej if ((status == YPPUSH_NOMAP) || (status == YPPUSH_DBM)) { 373 1.1 thorpej *lordernum = 0; 374 1.1 thorpej status = YPPUSH_SUCC; 375 1.1 thorpej } 376 1.1 thorpej 377 1.1 thorpej return (status); 378 1.1 thorpej } 379 1.1 thorpej 380 1.1 thorpej int 381 1.12 wiz get_remote_ordernum(CLIENT *client, char *domain, char *map, 382 1.12 wiz u_int lordernum, u_int *rordernum) 383 1.1 thorpej { 384 1.1 thorpej int status; 385 1.1 thorpej 386 1.1 thorpej status = yp_order_host(client, domain, map, (int *)rordernum); 387 1.1 thorpej 388 1.7 ross if (status == 0) { 389 1.1 thorpej if (*rordernum <= lordernum) 390 1.1 thorpej status = YPPUSH_AGE; 391 1.1 thorpej else 392 1.1 thorpej status = YPPUSH_SUCC; 393 1.18 chuck } else { 394 1.18 chuck status = yperr2yppush(status); 395 1.7 ross } 396 1.1 thorpej 397 1.1 thorpej return status; 398 1.1 thorpej } 399 1.1 thorpej 400 1.1 thorpej void 401 1.12 wiz get_map(CLIENT *client, char *domain, char *map, 402 1.12 wiz struct ypall_callback *incallback) 403 1.1 thorpej { 404 1.1 thorpej 405 1.1 thorpej (void)yp_all_host(client, domain, map, incallback); 406 1.1 thorpej } 407 1.1 thorpej 408 1.1 thorpej DBM * 409 1.15 lukem create_db(char *domain, char *map, char *db_temp, size_t db_temp_len) 410 1.1 thorpej { 411 1.15 lukem static const char template[] = "ypdbXXXXXX"; 412 1.16 lukem DBM *ldb; 413 1.1 thorpej 414 1.15 lukem snprintf(db_temp, db_temp_len, "%s/%s/%s", 415 1.15 lukem YP_DB_PATH, domain, template); 416 1.1 thorpej 417 1.16 lukem ldb = ypdb_mktemp(db_temp); 418 1.1 thorpej 419 1.16 lukem return ldb; 420 1.1 thorpej } 421 1.1 thorpej 422 1.1 thorpej int 423 1.15 lukem install_db(char *domain, char *map, char *db_temp) 424 1.1 thorpej { 425 1.15 lukem char db_name[MAXPATHLEN]; 426 1.1 thorpej 427 1.1 thorpej snprintf(db_name, sizeof(db_name), "%s/%s/%s%s", 428 1.1 thorpej YP_DB_PATH, domain, map, YPDB_SUFFIX); 429 1.1 thorpej 430 1.1 thorpej if (rename(db_temp, db_name)) { 431 1.1 thorpej warn("can't rename `%s' -> `%s'", db_temp, db_name); 432 1.1 thorpej return YPPUSH_YPERR; 433 1.1 thorpej } 434 1.1 thorpej 435 1.1 thorpej return YPPUSH_SUCC; 436 1.1 thorpej } 437 1.1 thorpej 438 1.1 thorpej int 439 1.15 lukem unlink_db(char *domain, char *map, char *db_temp) 440 1.1 thorpej { 441 1.1 thorpej 442 1.1 thorpej if (unlink(db_temp)) { 443 1.1 thorpej warn("can't unlink `%s'", db_temp); 444 1.1 thorpej return YPPUSH_YPERR; 445 1.1 thorpej } 446 1.1 thorpej 447 1.1 thorpej return YPPUSH_SUCC; 448 1.1 thorpej } 449 1.1 thorpej 450 1.1 thorpej int 451 1.16 lukem add_order(DBM *ldb, u_int ordernum) 452 1.1 thorpej { 453 1.1 thorpej char datestr[11]; 454 1.1 thorpej datum key, val; 455 1.1 thorpej char keystr[] = YP_LAST_KEY; 456 1.1 thorpej int status; 457 1.1 thorpej 458 1.1 thorpej snprintf(datestr, sizeof(datestr), "%010d", ordernum); 459 1.1 thorpej 460 1.1 thorpej key.dptr = keystr; 461 1.1 thorpej key.dsize = strlen(keystr); 462 1.1 thorpej 463 1.1 thorpej val.dptr = datestr; 464 1.1 thorpej val.dsize = strlen(datestr); 465 1.1 thorpej 466 1.16 lukem status = ypdb_store(ldb, key, val, YPDB_INSERT); 467 1.1 thorpej if(status >= 0) 468 1.1 thorpej status = YPPUSH_SUCC; 469 1.1 thorpej else 470 1.1 thorpej status = YPPUSH_DBM; 471 1.1 thorpej 472 1.1 thorpej return (status); 473 1.1 thorpej } 474 1.1 thorpej 475 1.1 thorpej int 476 1.16 lukem add_master(CLIENT *client, char *domain, char *map, DBM *ldb) 477 1.1 thorpej { 478 1.1 thorpej char keystr[] = YP_MASTER_KEY; 479 1.1 thorpej char *master; 480 1.1 thorpej int status; 481 1.5 lukem datum key, val; 482 1.1 thorpej 483 1.1 thorpej master = NULL; 484 1.1 thorpej 485 1.1 thorpej /* Get MASTER */ 486 1.1 thorpej status = yp_master_host(client, domain, map, &master); 487 1.1 thorpej 488 1.1 thorpej if (master != NULL) { 489 1.1 thorpej key.dptr = keystr; 490 1.1 thorpej key.dsize = strlen(keystr); 491 1.1 thorpej 492 1.1 thorpej val.dptr = master; 493 1.1 thorpej val.dsize = strlen(master); 494 1.1 thorpej 495 1.16 lukem status = ypdb_store(ldb, key, val, YPDB_INSERT); 496 1.1 thorpej if (status >= 0) 497 1.1 thorpej status = YPPUSH_SUCC; 498 1.1 thorpej else 499 1.1 thorpej status = YPPUSH_DBM; 500 1.18 chuck } else { 501 1.18 chuck status = yperr2yppush(status); 502 1.1 thorpej } 503 1.1 thorpej 504 1.1 thorpej return status; 505 1.1 thorpej } 506 1.1 thorpej 507 1.1 thorpej int 508 1.16 lukem add_interdomain(CLIENT *client, char *domain, char *map, DBM *ldb) 509 1.1 thorpej { 510 1.1 thorpej char keystr[] = YP_INTERDOMAIN_KEY; 511 1.1 thorpej char *value; 512 1.1 thorpej int vallen; 513 1.1 thorpej int status; 514 1.1 thorpej datum k, v; 515 1.1 thorpej 516 1.1 thorpej /* Get INTERDOMAIN */ 517 1.1 thorpej k.dptr = keystr; 518 1.1 thorpej k.dsize = strlen(keystr); 519 1.1 thorpej 520 1.1 thorpej status = yp_match_host(client, domain, map, 521 1.1 thorpej k.dptr, k.dsize, &value, &vallen); 522 1.1 thorpej 523 1.19 chuck if (status == YPERR_KEY) { 524 1.19 chuck /* this is an optional key/val, so it may not be present */ 525 1.19 chuck status = YPPUSH_SUCC; 526 1.19 chuck } else if (status == 0 && value) { 527 1.1 thorpej v.dptr = value; 528 1.1 thorpej v.dsize = vallen; 529 1.1 thorpej 530 1.1 thorpej if (v.dptr != NULL) { 531 1.16 lukem status = ypdb_store(ldb, k, v, YPDB_INSERT); 532 1.1 thorpej if (status >= 0) 533 1.1 thorpej status = YPPUSH_SUCC; 534 1.1 thorpej else 535 1.1 thorpej status = YPPUSH_DBM; 536 1.1 thorpej } 537 1.18 chuck } else { 538 1.18 chuck status = yperr2yppush(status); 539 1.1 thorpej } 540 1.1 thorpej 541 1.1 thorpej return status; 542 1.1 thorpej } 543 1.1 thorpej 544 1.1 thorpej int 545 1.16 lukem add_secure(CLIENT *client, char *domain, char *map, DBM *ldb) 546 1.1 thorpej { 547 1.1 thorpej char keystr[] = YP_SECURE_KEY; 548 1.1 thorpej char *value; 549 1.1 thorpej int vallen; 550 1.1 thorpej int status; 551 1.1 thorpej datum k, v; 552 1.1 thorpej 553 1.1 thorpej /* Get SECURE */ 554 1.1 thorpej k.dptr = keystr; 555 1.1 thorpej k.dsize = strlen(keystr); 556 1.1 thorpej 557 1.1 thorpej status = yp_match_host(client, domain, map, 558 1.1 thorpej k.dptr, k.dsize, &value, &vallen); 559 1.1 thorpej 560 1.19 chuck if (status == YPERR_KEY) { 561 1.19 chuck /* this is an optional key/val, so it may not be present */ 562 1.19 chuck status = YPPUSH_SUCC; 563 1.19 chuck } else if (status == 0 && value != 0) { 564 1.1 thorpej v.dptr = value; 565 1.1 thorpej v.dsize = vallen; 566 1.1 thorpej 567 1.1 thorpej if (v.dptr != NULL) { 568 1.16 lukem status = ypdb_store(ldb, k, v, YPDB_INSERT); 569 1.1 thorpej if (status >= 0) 570 1.1 thorpej status = YPPUSH_SUCC; 571 1.1 thorpej else 572 1.1 thorpej status = YPPUSH_DBM; 573 1.1 thorpej } 574 1.18 chuck } else { 575 1.18 chuck status = yperr2yppush(status); 576 1.1 thorpej } 577 1.1 thorpej 578 1.1 thorpej return status; 579 1.1 thorpej } 580 1.1 thorpej 581 1.1 thorpej int 582 1.12 wiz send_clear(CLIENT *client) 583 1.1 thorpej { 584 1.1 thorpej struct timeval tv; 585 1.1 thorpej int r; 586 1.1 thorpej int status; 587 1.1 thorpej 588 1.1 thorpej status = YPPUSH_SUCC; 589 1.1 thorpej 590 1.1 thorpej tv.tv_sec = 10; 591 1.1 thorpej tv.tv_usec = 0; 592 1.1 thorpej 593 1.1 thorpej /* Send CLEAR */ 594 1.1 thorpej r = clnt_call(client, YPPROC_CLEAR, xdr_void, 0, xdr_void, 0, tv); 595 1.1 thorpej if (r != RPC_SUCCESS) { 596 1.1 thorpej clnt_perror(client, "yp_clear: clnt_call"); 597 1.1 thorpej status = YPPUSH_RPC; 598 1.1 thorpej } 599 1.1 thorpej 600 1.1 thorpej return status; 601 1.1 thorpej } 602 1.1 thorpej 603 1.1 thorpej int 604 1.12 wiz send_reply(CLIENT *client, int status, int tid) 605 1.1 thorpej { 606 1.1 thorpej struct timeval tv; 607 1.1 thorpej struct ypresp_xfr resp; 608 1.1 thorpej int r; 609 1.1 thorpej 610 1.1 thorpej tv.tv_sec = 10; 611 1.1 thorpej tv.tv_usec = 0; 612 1.1 thorpej 613 1.1 thorpej resp.transid = tid; 614 1.1 thorpej resp.xfrstat = status; 615 1.1 thorpej 616 1.1 thorpej /* Send XFRRESP */ 617 1.1 thorpej r = clnt_call(client, YPPUSHPROC_XFRRESP, xdr_ypresp_xfr, &resp, 618 1.1 thorpej xdr_void, 0, tv); 619 1.1 thorpej if (r != RPC_SUCCESS) { 620 1.1 thorpej clnt_perror(client, "yppushresp_xdr: clnt_call"); 621 1.1 thorpej status = YPPUSH_RPC; 622 1.1 thorpej } 623 1.1 thorpej 624 1.1 thorpej return status; 625 1.1 thorpej } 626