static void unexportfs_parsed(char *hname, char *path, int verbose) { nfs_export *exp; struct addrinfo *ai = NULL; int htype; int success = 0; if ((htype = client_gettype(hname)) == MCL_FQDN) { ai = host_addrinfo(hname); if (ai) hname = ai->ai_canonname; } for (exp = exportlist[htype].p_head; exp; exp = exp->m_next) { if (path && strcmp(path, exp->m_export.e_path)) continue; if (htype != exp->m_client->m_type) continue; if (htype == MCL_FQDN && !matchhostname(exp->m_export.e_hostname, hname)) continue; if (htype != MCL_FQDN && strcasecmp(exp->m_export.e_hostname, hname)) continue; if (verbose) { #if 0 if (exp->m_exported) { printf("unexporting %s:%s from kernel\n", exp->m_client->m_hostname, exp->m_export.e_path); } else #endif printf("unexporting %s:%s\n", exp->m_client->m_hostname, exp->m_export.e_path); } #if 0 if (exp->m_exported && !export_unexport(exp)) error(exp, errno); #endif exp->m_xtabent = 0; exp->m_mayexport = 0; success = 1; } if (!success) xlog(L_ERROR, "Could not find '%s:%s' to unexport.", hname, path); freeaddrinfo(ai); }
int rmtab_read(void) { struct rmtabent *rep; setrmtabent("r"); while ((rep = getrmtabent(1, NULL)) != NULL) { int htype; htype = client_gettype(rep->r_client); if (htype == MCL_FQDN || htype == MCL_SUBNETWORK) rmtab_read_wildcard(rep); } if (errno == EINVAL) { /* Something goes wrong. We need to fix the rmtab file. */ int lockid; FILE *fp; if ((lockid = xflock(_PATH_RMTABLCK, "w")) < 0) return -1; rewindrmtabent(); if (!(fp = fsetrmtabent(_PATH_RMTABTMP, "w"))) { endrmtabent (); xfunlock(lockid); return -1; } while ((rep = getrmtabent(0, NULL)) != NULL) { fputrmtabent(fp, rep, NULL); } if (rename(_PATH_RMTABTMP, _PATH_RMTAB) < 0) { xlog(L_ERROR, "couldn't rename %s to %s", _PATH_RMTABTMP, _PATH_RMTAB); } endrmtabent(); fendrmtabent(fp); xfunlock(lockid); } else { endrmtabent(); } 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); }
static exports get_exportlist(void) { static exports elist = NULL; struct exportnode *e, *ne; struct groupnode *g, *ng, *c, **cp; nfs_export *exp; int i; static unsigned int ecounter; unsigned int acounter; acounter = auth_reload(); if (elist && acounter == ecounter) return elist; ecounter = acounter; for (e = elist; e != NULL; e = ne) { ne = e->ex_next; for (g = e->ex_groups; g != NULL; g = ng) { ng = g->gr_next; xfree(g->gr_name); xfree(g); } xfree(e->ex_dir); xfree(e); } elist = NULL; for (i = 0; i < MCL_MAXTYPES; i++) { for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { for (e = elist; e != NULL; e = e->ex_next) { if (!strcmp(exp->m_export.e_path, e->ex_dir)) break; } if (!e) { e = (struct exportnode *) xmalloc(sizeof(*e)); e->ex_next = elist; e->ex_groups = NULL; e->ex_dir = xstrdup(exp->m_export.e_path); elist = e; } /* We need to check if we should remove previous ones. */ if (i == MCL_ANONYMOUS && e->ex_groups) { for (g = e->ex_groups; g; g = ng) { ng = g->gr_next; xfree(g->gr_name); xfree(g); } e->ex_groups = NULL; continue; } if (i != MCL_FQDN && e->ex_groups) { struct hostent *hp; cp = &e->ex_groups; while ((c = *cp) != NULL) { if (client_gettype (c->gr_name) == MCL_FQDN && (hp = gethostbyname(c->gr_name))) { hp = hostent_dup (hp); if (client_check(exp->m_client, hp)) { *cp = c->gr_next; xfree(c->gr_name); xfree(c); xfree (hp); continue; } xfree (hp); } cp = &(c->gr_next); } } if (exp->m_export.e_hostname [0] != '\0') { for (g = e->ex_groups; g; g = g->gr_next) if (strcmp (exp->m_export.e_hostname, g->gr_name) == 0) break; if (g) continue; g = (struct groupnode *) xmalloc(sizeof(*g)); g->gr_name = xstrdup(exp->m_export.e_hostname); g->gr_next = e->ex_groups; e->ex_groups = g; } } } return elist; }