/* * See if the entry already exists. If not, * this was an instantiated wild card, and we * must add it. */ static void rmtab_read_wildcard(struct rmtabent *rep) { nfs_export *exp, *exp2; struct addrinfo *ai; ai = host_addrinfo(rep->r_client); if (ai == NULL) return; exp = export_allowed(ai, rep->r_path); freeaddrinfo(ai); if (exp == NULL) return; exp2 = export_lookup(rep->r_client, exp->m_export.e_path, 0); if (exp2 == NULL) { struct exportent ee; memset(&ee, 0, sizeof(ee)); dupexportent(&ee, &exp->m_export); ee.e_hostname = rep->r_client; exp2 = export_create(&ee, 0); exp2->m_changed = exp->m_changed; } exp2->m_mayexport = 1; }
/** * export_read - read entries from /etc/exports * @fname: name of file to read from * */ void export_read(char *fname) { struct exportent *eep; nfs_export *exp; setexportent(fname, "r"); while ((eep = getexportent(0,1)) != NULL) { exp = export_lookup(eep->e_hostname, eep->e_path, 0); if (!exp) export_create(eep, 0); else warn_duplicated_exports(exp, eep); } endexportent(); }
static int xtab_read(char *xtab, char *lockfn, int is_export) { /* is_export == 0 => reading /proc/fs/nfs/exports - we know these things are exported to kernel * is_export == 1 => reading /var/lib/nfs/etab - these things are allowed to be exported * is_export == 2 => reading /var/lib/nfs/xtab - these things might be known to kernel */ struct exportent *xp; nfs_export *exp; int lockid; if ((lockid = xflock(lockfn, "r")) < 0) return 0; setexportent(xtab, "r"); if (is_export == 1) v4root_needed = 1; while ((xp = getexportent(is_export==0, 0)) != NULL) { if (!(exp = export_lookup(xp->e_hostname, xp->e_path, is_export != 1)) && !(exp = export_create(xp, is_export!=1))) { continue; } switch (is_export) { case 0: exp->m_exported = 1; break; case 1: exp->m_xtabent = 1; exp->m_mayexport = 1; if ((xp->e_flags & NFSEXP_FSID) && xp->e_fsid == 0) v4root_needed = 0; break; case 2: exp->m_exported = -1;/* may be exported */ break; } } endexportent(); xfunlock(lockid); return 0; }
static void exportfs_parsed(char *hname, char *path, char *options, int verbose) { struct exportent *eep; nfs_export *exp = NULL; struct addrinfo *ai = NULL; int htype; if ((htype = client_gettype(hname)) == MCL_FQDN) { ai = host_addrinfo(hname); if (ai != NULL) { exp = export_find(ai, path); hname = ai->ai_canonname; } } else exp = export_lookup(hname, path, 0); if (!exp) { if (!(eep = mkexportent(hname, path, options)) || !(exp = export_create(eep, 0))) goto out; } else if (!updateexportent(&exp->m_export, options)) goto out; if (verbose) printf("exporting %s:%s\n", exp->m_client->m_hostname, exp->m_export.e_path); exp->m_xtabent = 1; exp->m_mayexport = 1; exp->m_changed = 1; exp->m_warned = 0; validate_export(exp); out: freeaddrinfo(ai); }