/* * mountd now keeps an open fd for the etab at all times to make sure that the * inode number changes when the xtab_export_write is done. If you change the * routine below such that the files are edited in place, then you'll need to * fix the auth_reload logic as well... */ static int xtab_write(char *xtab, char *xtabtmp, char *lockfn, int is_export) { struct exportent xe; nfs_export *exp; int lockid, i; if ((lockid = xflock(lockfn, "w")) < 0) { xlog(L_ERROR, "can't lock %s for writing", xtab); return 0; } setexportent(xtabtmp, "w"); for (i = 0; i < MCL_MAXTYPES; i++) { for (exp = exportlist[i].p_head; exp; exp = exp->m_next) { if (is_export && !exp->m_xtabent) continue; if (!is_export && ! exp->m_exported) continue; /* write out the export entry using the FQDN */ xe = exp->m_export; xe.e_hostname = exp->m_client->m_hostname; putexportent(&xe); } } endexportent(); cond_rename(xtabtmp, xtab); xfunlock(lockid); return 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(); }
void xtab_append(nfs_export *exp) { struct exportent xe; int lockid; if ((lockid = xflock(_PATH_XTABLCK, "w")) < 0) return; setexportent(_PATH_XTAB, "a"); xe = exp->m_export; xe.e_hostname = exp->m_client->m_hostname; putexportent(&xe); endexportent(); xfunlock(lockid); exp->m_xtabent = 1; }
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; }