int main(int argc, char *argv[]) { struct ypall_callback ypcb; extern char *optarg; extern int optind; char *domain, *map, *hostname; int c, r, i; char *ypmap = "ypservers"; CLIENT *client; static char map_path[MAXPATHLEN]; struct stat finfo; DBM *yp_databas; char order_key[YP_LAST_LEN] = YP_LAST_KEY; datum o; yp_get_default_domain(&domain); hostname = NULL; while ((c=getopt(argc, argv, "d:h:v")) != -1) switch (c) { case 'd': domain = optarg; break; case 'h': hostname = optarg; break; case 'v': Verbose = 1; break; default: usage(); /*NOTREACHED*/ } if (optind + 1 != argc ) usage(); map = argv[optind]; strncpy(Domain, domain, sizeof(Domain)-1); Domain[sizeof(Domain)-1] = '\0'; strncpy(Map, map, sizeof(Map)-1); Map[sizeof(Map)-1] = '\0'; /* Check domain */ snprintf(map_path, sizeof map_path, "%s/%s", YP_DB_PATH, domain); if (!((stat(map_path, &finfo) == 0) && S_ISDIR(finfo.st_mode))) { fprintf(stderr, "yppush: Map does not exist.\n"); exit(1); } /* Check map */ snprintf(map_path, sizeof map_path, "%s/%s/%s%s", YP_DB_PATH, domain, Map, YPDB_SUFFIX); if (!(stat(map_path, &finfo) == 0)) { fprintf(stderr, "yppush: Map does not exist.\n"); exit(1); } snprintf(map_path, sizeof map_path, "%s/%s/%s", YP_DB_PATH, domain, Map); yp_databas = ypdb_open(map_path, 0, O_RDONLY); OrderNum=0xffffffff; if (yp_databas == 0) { fprintf(stderr, "yppush: %s%s: Cannot open database\n", map_path, YPDB_SUFFIX); } else { o.dptr = (char *) &order_key; o.dsize = YP_LAST_LEN; o = ypdb_fetch(yp_databas, o); if (o.dptr == NULL) { fprintf(stderr, "yppush: %s: Cannot determine order number\n", Map); } else { OrderNum=0; for (i=0; i<o.dsize-1; i++) { if (!isdigit(o.dptr[i])) OrderNum=0xffffffff; } if (OrderNum != 0) { fprintf(stderr, "yppush: %s: Invalid order number '%s'\n", Map, o.dptr); } else { OrderNum = atoi(o.dptr); } } } yp_bind(Domain); r = yp_master(Domain, ypmap, &master); if (r != 0) { fprintf(stderr, "yppush: could not get ypservers map\n"); exit(1); } if (hostname != NULL) { push(strlen(hostname), hostname); } else { if (Verbose) { printf("Contacting master for ypservers (%s).\n", master); } client = yp_bind_host(master, YPPROG, YPVERS, 0, 1); ypcb.foreach = pushit; ypcb.data = NULL; r = yp_all_host(client, Domain, ypmap, &ypcb); } exit(0); }
int main(int argc, char *argv[]) { int cflag = 0, fflag = 0, Cflag = 0; char *domain, *host = NULL, *srcdomain = NULL; char *tid = NULL, *prog = NULL, *ipadd = NULL; char *port = NULL, *map = NULL; int status, xfr_status, ch, srvport; u_int32_t ordernum, new_ordernum; struct ypall_callback callback; CLIENT *client = NULL; extern char *optarg; yp_get_default_domain(&domain); while ((ch = getopt(argc, argv, "cd:fh:s:C:")) != -1) switch (ch) { case 'c': cflag++; break; case 'd': if (strchr(optarg, '/')) /* Ha ha, we are not listening */ break; domain = optarg; break; case 'f': fflag++; break; case 'h': host = optarg; break; case 's': if (strchr(optarg, '/')) /* Ha ha, we are not listening */ break; srcdomain = optarg; break; case 'C': if (optind + 3 >= argc) usage(); Cflag++; tid = optarg; prog = argv[optind++]; ipadd = argv[optind++]; port = argv[optind++]; break; default: usage(); break; } status = YPPUSH_SUCC; if (optind + 1 != argc) usage(); map = argv[optind]; if (status > 0) { ypopenlog(); yplog("ypxfr: Arguments:"); yplog("YP clear to local: %s", (cflag) ? "no" : "yes"); yplog(" Force transfer: %s", (fflag) ? "yes" : "no"); yplog(" domain: %s", domain); yplog(" host: %s", host); yplog(" source domain: %s", srcdomain); yplog(" transid: %s", tid); yplog(" prog: %s", prog); yplog(" port: %s", port); yplog(" ipadd: %s", ipadd); yplog(" map: %s", map); if (fflag != 0) { ordernum = 0; } else { status = get_local_ordernum(domain, map, &ordernum); } } if (status > 0) { yplog("Get Master"); if (host == NULL) { if (srcdomain == NULL) { status = yp_master(domain, map, &host); } else { status = yp_master(srcdomain, map, &host); } if (status == 0) { status = YPPUSH_SUCC; } else { status = -status; } } } /* XXX this is raceable if portmap has holes! */ if (status > 0) { yplog("Check for reserved port on host: %s", host); srvport = getrpcport(host, YPPROG, YPVERS, IPPROTO_TCP); if (srvport >= IPPORT_RESERVED) status = YPPUSH_REFUSED; } if (status > 0) { yplog("Connect host: %s", host); client = yp_bind_host(host, YPPROG, YPVERS, 0, 1); status = get_remote_ordernum(client, domain, map, ordernum, &new_ordernum); } if (status == YPPUSH_SUCC) { char tmpmapname[MAXPATHLEN]; int fd; /* Create temporary db */ snprintf(tmpmapname, sizeof tmpmapname, "%s/%s/ypdbXXXXXXXXXX", YP_DB_PATH, domain); fd = mkstemp(tmpmapname); if (fd == -1) status = YPPUSH_DBM; else close(fd); if (status > 0) { db = create_db(domain, map, tmpmapname); if (db == NULL) status = YPPUSH_DBM; } /* Add ORDER */ if (status > 0) status = add_order(db, new_ordernum); /* Add MASTER */ if (status > 0) status = add_master(client, domain, map, db); /* Add INTERDOMAIN */ if (status > 0) status = add_interdomain(client, domain, map, db); /* Add SECURE */ if (status > 0) status = add_secure(client, domain, map, db); if (status > 0) { callback.foreach = ypxfr_foreach; status = get_map(client, domain, map, &callback); } /* Close db */ if (db != NULL) ypdb_close(db); /* Rename db */ if (status > 0) { status = install_db(domain, map, tmpmapname); } else { unlink(tmpmapname); status = YPPUSH_SUCC; } } xfr_status = status; if (client != NULL) clnt_destroy(client); /* YP_CLEAR */ if (!cflag) { client = yp_bind_local(YPPROG, YPVERS); status = send_clear(client); clnt_destroy(client); } if (Cflag > 0) { /* Send Response */ client = yp_bind_host(ipadd, atoi(prog), 1, atoi(port), 0); status = send_reply(client, xfr_status, atoi(tid)); clnt_destroy(client); } return (0); }