#include <unistd.h>
#include <syslog.h>
#include <ndbm.h>
#include <sys/systeminfo.h>
#include <string.h>
#include <lber.h>
#include <ldap.h>
#include <errno.h>
#include "ypsym.h"
#include "ypdefs.h"
#include "shim.h"
#include "../ldap_structs.h"
#include "../ldap_parse.h"
#include "../nisdb_ldap.h"
#include "../ldap_util.h"
#include "../ldap_op.h"
#include "../ldap_attr.h"
#include "../nis_parse_ldap_conf.h"
#include "../nisdb_mt.h"
#include "yptol.h"
#include "dit_access_utils.h"
#include "stdio.h"
extern bool delete_map(char *name);
extern bool rename_map(char *from, char *to, bool_t secure_map);
USE_YP_MASTER_NAME
USE_YP_DOMAIN_NAME
USE_YP_SECURE
USE_YP_INTERDOMAIN
suc_code add_special_entries(DBM *, map_ctrl *, bool_t *);
void free_null_terminated_list(char **list);
bool_t
is_yptol_mode()
{
struct stat filestat;
if (stat(YP_DEFAULTCONFFILE, &filestat) != -1)
return (TRUE);
return (FALSE);
}
int
read_from_dit(char *map, char *domain, datum *key, datum *value)
{
int count;
int res;
__nisdb_retry_t *retrieveRetry;
__nisdb_get_tsd()->domainContext = 0;
__nisdb_get_tsd()->escapeFlag = '\0';
for (count = 0; count < ypDomains.numDomains; count++) {
if (0 == ypDomains.domainLabels[count])
continue;
if (0 == strcasecmp(domain, ypDomains.domainLabels[count])) {
__nisdb_get_tsd()->domainContext =
ypDomains.domains[count];
break;
}
}
retrieveRetry = &ldapDBTableMapping.retrieveErrorRetry;
for (count = retrieveRetry->attempts; (0 <= count) ||
(-1 == retrieveRetry->attempts); count --) {
if (TRUE == singleReadFromDIT(map, domain, key, value, &res))
return (0);
if (LDAP_TIMEOUT == res) {
value->dptr = NULL;
return (0);
}
if (is_fatal_error(res))
break;
if (0 != retrieveRetry->attempts)
(void) poll(NULL, 0, retrieveRetry->timeout*1000);
}
value->dptr = NULL;
if (ldapDBTableMapping.retrieveError == use_cached)
return (0);
return (res);
}
suc_code
write_to_dit(char *map, char *domain, datum key, datum value,
bool_t replace, bool_t ignore_map_errs)
{
int count;
int res;
__nisdb_retry_t *storeRetry = &ldapDBTableMapping.storeErrorRetry;
__nisdb_get_tsd()->domainContext = 0;
__nisdb_get_tsd()->escapeFlag = '\0';
for (count = 0; count < ypDomains.numDomains; count++) {
if (0 == ypDomains.domainLabels[count])
continue;
if (0 == strcasecmp(domain, ypDomains.domainLabels[count])) {
__nisdb_get_tsd()->domainContext =
ypDomains.domains[count];
break;
}
}
storeRetry = &ldapDBTableMapping.storeErrorRetry;
for (count = storeRetry->attempts; (0 <= count) ||
(-1 == storeRetry->attempts); count --) {
res = singleWriteToDIT(map, domain, &key, &value, replace);
if (LDAP_SUCCESS == res)
return (SUCCESS);
if (is_fatal_error(res)) {
if (ignore_map_errs) {
switch (res) {
case LDAP_INVALID_DN_SYNTAX:
case LDAP_OBJECT_CLASS_VIOLATION:
case LDAP_NOT_ALLOWED_ON_RDN:
case MAP_NAMEFIELD_MATCH_ERROR:
case MAP_NO_DN:
return (SUCCESS);
default:
break;
}
}
return (FAILURE);
}
if (ldapDBTableMapping.storeError != sto_retry)
return (FAILURE);
if (0 != storeRetry->attempts)
(void) poll(NULL, 0, storeRetry->timeout*1000);
}
return (FAILURE);
}
int
get_ttl_value(map_ctrl *map, TTL_TYPE type)
{
__nis_table_mapping_t *table_map;
int interval, res;
char *myself = "get_ttl_value";
table_map = mappingFromMap(map->map_name, map->domain, &res);
if (0 == table_map) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"Get TTL request could not access map %s in domain %s "
"(error %d)", map->map_name, map->domain, res);
return (-1);
}
switch (type) {
case TTL_MAX:
return (table_map->initTtlHi);
case TTL_MIN:
return (table_map->initTtlLo);
default:
logmsg(MSG_NOTIMECHECK, LOG_INFO,
"%s passed illegal TTL type (%d)", myself, type);
case TTL_RAND:
interval = table_map->initTtlHi - table_map->initTtlLo;
if (0 >= interval)
return (table_map->initTtlLo);
return (lrand48() % interval);
case TTL_RUNNING:
return (table_map->ttl);
}
}
int
get_mapping_domain_list(char ***ptr)
{
*ptr = ypDomains.domainLabels;
return (ypDomains.numDomains);
}
int
get_mapping_yppasswdd_domain_list(char ***ptr)
{
*ptr = ypDomains.yppasswddDomainLabels;
return (ypDomains.numYppasswdd);
}
void
free_map_list(char **map_list)
{
free_null_terminated_list(map_list);
}
char **
get_passwd_list(bool_t adjunct, char *domain)
{
char *myself = "get_passwd_list";
__nis_hash_item_mt *it;
int i, size;
char *end_ptr;
char *target;
int target_len;
int domain_len;
char **res;
char **res_old;
int array_size;
int res_count = 0;
res = am(myself, ARRAY_CHUNK * sizeof (char *));
if (NULL == res)
return (NULL);
array_size = ARRAY_CHUNK;
if (adjunct)
target = PASSWD_ADJUNCT_PREFIX;
else
target = PASSWD_PREFIX;
target_len = strlen(target);
domain_len = strlen(domain);
size = sizeof (ldapMappingList.keys) / sizeof (ldapMappingList.keys[0]);
for (i = 0; i < size; i++) {
for (it = ldapMappingList.keys[i]; NULL != it; it = it->next) {
if ((target_len + domain_len + 1) > strlen(it->name))
continue;
if (0 != strncmp(it->name, target, target_len))
continue;
if (strlen(domain) >= strlen(it->name))
continue;
end_ptr = it->name + strlen(it->name) -
strlen(domain) - 1;
if (',' != *(end_ptr - 1))
continue;
if (0 != strncmp(end_ptr, domain, strlen(domain)))
continue;
if ((res_count + 1) >= array_size) {
array_size += ARRAY_CHUNK;
res_old = res;
res = realloc(res, array_size *
sizeof (char *));
if (NULL == res) {
res_old[res_count] = NULL;
free_passwd_list(res_old);
return (NULL);
}
}
res[res_count] = am(myself, end_ptr - it->name + 1);
if (NULL == res[res_count]) {
free_passwd_list(res);
return (NULL);
}
(void) memcpy(res[res_count], it->name,
end_ptr-it->name - 1);
res_count ++;
}
}
res[res_count] = NULL;
return (res);
}
void
free_passwd_list(char **list)
{
free_null_terminated_list(list);
}
void
free_null_terminated_list(char **list)
{
int index;
for (index = 0; NULL != list[index]; index ++)
sfree(list[index]);
sfree(list);
}
suc_code
add_special_entries(DBM *db, map_ctrl *map, bool_t *secure_flag)
{
char local_host[MAX_MASTER_NAME];
__nis_table_mapping_t *table_map;
int res;
update_timestamp(db);
addpair(db, yp_domain_name, map->domain);
sysinfo(SI_HOSTNAME, local_host, sizeof (local_host));
addpair(db, yp_master_name, local_host);
table_map = mappingFromMap(map->map_name, map->domain, &res);
if (0 == table_map)
return (FAILURE);
if (table_map->securemap_flag) {
addpair(db, yp_secure, "");
*secure_flag = TRUE;
} else {
*secure_flag = FALSE;
}
if (table_map->usedns_flag)
addpair(db, yp_interdomain, "");
return (SUCCESS);
}
suc_code
update_map_from_dit(map_ctrl *map, bool_t log_flag) {
__nis_table_mapping_t *t;
__nis_rule_value_t *rv;
__nis_ldap_search_t *ls;
__nis_object_dn_t *objectDN = NULL;
datum *datval, *datkey;
int nr = 0, i, j, nv, numDNs;
int statP = SUCCESS, flag;
char *objname, **dn;
char *temp_entries;
char *temp_ttl;
DBM *temp_entries_db;
DBM *temp_ttl_db;
map_ctrl temp_map;
datum key;
char *myself = "update_map_from_dit";
bool_t secure_flag;
int entry_count = 1;
int next_print = PRINT_FREQ;
int search_flag = SUCCESS;
int m;
char *xlate_to_lcase_maps[] = {
"hosts.byname",
"ipnodes.byname",
NULL
};
bool_t xlate_to_lcase = FALSE;
if (!map || !map->map_name || !map->domain) {
return (FAILURE);
}
__nisdb_get_tsd()->escapeFlag = '\0';
if ((0 == strcmp(map->map_name, NETGROUP_BYHOST)) ||
0 == (strcmp(map->map_name, NETGROUP_BYUSER))) {
return (update_netgroup_byxxx(map));
}
if ((t = mappingFromMap(map->map_name, map->domain, &statP)) == 0) {
if (statP == MAP_NO_MAPPING_EXISTS)
logmsg(MSG_NOTIMECHECK, LOG_WARNING,
"%s: No mapping information available for %s,%s",
myself, map->map_name, map->domain);
return (FAILURE);
}
if (SUCCESS != alloc_temp_names(map->map_path,
&temp_entries, &temp_ttl)) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Unable to create map names for %s",
myself, map->map_path);
return (FAILURE);
}
if ((temp_entries_db = dbm_open(temp_entries, O_RDWR | O_CREAT, 0644))
== NULL) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not open %s",
myself, temp_entries);
sfree(temp_entries);
sfree(temp_ttl);
return (FAILURE);
}
if ((temp_ttl_db = dbm_open(temp_ttl, O_RDWR | O_CREAT, 0644))
== NULL) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not open %s",
myself, temp_ttl);
dbm_close(temp_entries_db);
delete_map(temp_entries);
sfree(temp_entries);
sfree(temp_ttl);
return (FAILURE);
}
__nisdb_get_tsd()->domainContext = 0;
for (i = 0; i < ypDomains.numDomains; i++) {
if (0 == ypDomains.domainLabels[i])
continue;
if (0 == strcasecmp(map->domain, ypDomains.domainLabels[i])) {
__nisdb_get_tsd()->domainContext = ypDomains.domains[i];
break;
}
}
if (!(objname = getFullMapName(map->map_name, map->domain))) {
if (temp_entries_db)
dbm_close(temp_entries_db);
if (temp_ttl_db)
dbm_close(temp_ttl_db);
delete_map(temp_entries);
sfree(temp_entries);
delete_map(temp_ttl);
sfree(temp_ttl);
return (FAILURE);
}
m = 0;
while (xlate_to_lcase_maps[m] != NULL) {
if (strncmp(map->map_name, xlate_to_lcase_maps[m],
strlen(xlate_to_lcase_maps[m])) == 0) {
xlate_to_lcase = TRUE;
break;
}
++m;
}
for (flag = 0; t != 0 && search_flag != FAILURE; t = t->next) {
if (strcmp(objname, t->objName) != 0) {
continue;
}
if (t->numRulesFromLDAP == 0) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: No rulesFromLDAP available for %s (%s)",
myself, t->dbId, map->map_name);
continue;
}
flag = 1;
for (objectDN = t->objectDN;
objectDN && objectDN->read.base;
objectDN = objectDN->next) {
if ((ls = createLdapRequest(t, 0, 0, 1, NULL,
objectDN)) == 0) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Failed to create "
"ldapSearch request for "
"%s (%s) for base %s",
myself, t->dbId,
map->map_name,
objectDN->read.base);
statP = FAILURE;
search_flag = FAILURE;
break;
}
if (log_flag) {
printf("Waiting for LDAP search results.\n");
}
nr = (ls->isDN)?0:-1;
rv = ldapSearch(ls, &nr, 0, &statP);
freeLdapSearch(ls);
if (rv == 0) {
if (statP == LDAP_NO_SUCH_OBJECT) {
continue;
}
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: ldapSearch error %d "
"(%s) for %s (%s) for base %s",
myself, statP, ldap_err2string(statP),
t->dbId, map->map_name,
objectDN->read.base);
statP = FAILURE;
search_flag = FAILURE;
break;
}
if (log_flag) {
printf("Processing search results.\n");
}
if ((dn = findDNs(myself, rv, nr, 0, &numDNs)) == 0) {
statP = FAILURE;
search_flag = FAILURE;
break;
}
for (i = 0; i < nr; i++) {
statP = buildNISRuleValue(t, &rv[i],
map->domain);
if (statP == MAP_INDEXLIST_ERROR)
continue;
if (statP != SUCCESS) {
logmsg(MSG_NOTIMECHECK, LOG_WARNING,
"%s: Conversion error %d (LDAP to "
"name=value pairs) "
"for (dn: %s) for "
"%s (%s) for base %s",
myself, statP, NIL(dn[i]),
t->dbId, map->map_name,
objectDN->read.base);
continue;
}
datval = ruleValueToDatum(t, &rv[i], &statP);
if (datval == 0) {
logmsg(MSG_NOTIMECHECK, LOG_WARNING,
"%s: Conversion error %d "
"(name=value pairs to NIS)"
" for (dn: %s) for "
"%s (%s) for base %s",
myself, statP, NIL(dn[i]),
t->dbId, map->map_name,
objectDN->read.base);
continue;
}
datkey = getKeyFromRuleValue(t, &rv[i],
&nv, &statP, xlate_to_lcase);
if (datkey == 0) {
logmsg(MSG_NOTIMECHECK, LOG_WARNING,
"%s: Unable to obtain NIS "
"key from LDAP data (dn:%s) "
"for %s (%s) for base %s",
myself, NIL(dn[i]), t->dbId,
map->map_name,
objectDN->read.base);
sfree(datval->dptr);
sfree(datval);
continue;
}
for (j = 0; j < nv; j++, entry_count ++) {
if (datkey[j].dsize == 0)
continue;
errno = 0;
if (dbm_store(temp_entries_db,
datkey[j],
*datval,
DBM_INSERT) < 0) {
logmsg(MSG_NOTIMECHECK,
LOG_WARNING,
"%s: dbm store error "
"(errno=%d) "
"for (key=%s, value=%s) "
"for %s (%s) for base %s",
myself,
errno,
datkey[j].dptr,
datval->dptr, t->dbId,
map->map_name,
objectDN->read.base);
dbm_clearerr(temp_entries_db);
}
sfree(datkey[j].dptr);
if (log_flag && (entry_count >=
next_print)) {
printf("%d entries processed\n",
entry_count);
next_print *= 2;
}
}
sfree(datkey);
sfree(datval->dptr);
sfree(datval);
}
freeRuleValue(rv, nr);
freeDNs(dn, numDNs);
}
}
sfree(objname);
if (t != 0 || flag == 0 || search_flag == FAILURE) {
if (temp_entries_db)
dbm_close(temp_entries_db);
if (temp_ttl_db)
dbm_close(temp_ttl_db);
delete_map(temp_entries);
sfree(temp_entries);
delete_map(temp_ttl);
sfree(temp_ttl);
return (statP);
}
temp_map.map_name = map->map_name;
temp_map.domain = map->domain;
temp_map.ttl = temp_ttl_db;
key = dbm_firstkey(temp_entries_db);
while (key.dptr != 0) {
if (!is_special_key(&key))
if (FAILURE == update_entry_ttl(&temp_map, &key,
TTL_RAND))
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Could not update TTL for "
"(key=%s) for map %s,%s",
myself, NIL(key.dptr), map->map_name,
map->domain);
key = dbm_nextkey(temp_entries_db);
}
if (SUCCESS != update_map_ttl(&temp_map)) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not update map TTL "
"for %s,%s", myself, map->map_name, map->domain);
}
add_special_entries(temp_entries_db, map, &secure_flag);
dbm_close(temp_entries_db);
dbm_close(temp_ttl_db);
lock_map_ctrl(map);
rename_map(temp_entries, map->map_path, secure_flag);
rename_map(temp_ttl, map->ttl_path, secure_flag);
sfree(temp_entries);
sfree(temp_ttl);
unlock_map_ctrl(map);
return (SUCCESS);
}
char **
get_mapping_map_list(char *domain)
{
char *myself = "get_mapping_map_list";
__nis_hash_item_mt *it;
int i, j, size;
char *end_ptr;
char **res;
char **res_old;
int array_size;
int res_count = 0;
res = am(myself, ARRAY_CHUNK * sizeof (char *));
if (NULL == res)
return (NULL);
array_size = ARRAY_CHUNK;
size = sizeof (ldapMappingList.keys) / sizeof (ldapMappingList.keys[0]);
for (i = 0; i < size; i++) {
for (it = ldapMappingList.keys[i]; NULL != it; it = it->next) {
if (0 != ((__nis_table_mapping_t *)it)->numSplits)
continue;
if (strlen(domain) >= strlen(it->name))
continue;
end_ptr = it->name + strlen(it->name) -
strlen(domain) - 1;
if (',' != *(end_ptr - 1))
continue;
if (0 != strncmp(end_ptr, domain, strlen(domain)))
continue;
if ((res_count + 1) >= array_size) {
array_size += ARRAY_CHUNK;
res_old = res;
res = realloc(res, array_size *
sizeof (char *));
if (NULL == res) {
res_old[res_count] = NULL;
free_passwd_list(res_old);
return (NULL);
}
}
res[res_count] = (char *)it;
res_count ++;
}
}
res[res_count] = NULL;
for (i = res_count - 2; 0 <= i; i--) {
for (j = 0; j <= i; j++) {
if (((__nis_table_mapping_t *)res[j + 1])->seq_num <
((__nis_table_mapping_t *)res[j])->seq_num) {
end_ptr = res[j];
res[j] = res[j+1];
res[j + 1] = end_ptr;
}
}
}
for (i = 0; NULL != res[i]; i ++) {
it = (__nis_hash_item_mt *)res[i];
end_ptr = it->name + strlen(it->name) - strlen(domain) - 1;
res[i] = am(myself, end_ptr - it->name + 1);
if (NULL == res[i]) {
free_map_list(res);
return (NULL);
}
(void) memcpy(res[i], it->name, end_ptr-it->name - 1);
}
return (res);
}
suc_code
make_nis_container(char *map_name, char *domain, bool_t init_containers) {
int i, rc, statP = SUCCESS;
__nis_table_mapping_t *t;
char *dn;
char *myself = "make_nis_container";
if (!map_name || !domain)
return (FAILURE);
if (FALSE == init_containers) {
return (SUCCESS);
}
if ((t = mappingFromMap(map_name, domain, &statP)) == 0) {
if (statP == MAP_NO_MAPPING_EXISTS)
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: No mapping information available for %s,%s",
myself, NIL(map_name), NIL(domain));
return (FAILURE);
}
for (i = 0; i < 2; i++) {
if (i == 0)
dn = t->objectDN->read.base;
else {
if (t->objectDN->write.base == 0) {
logmsg(MSG_NOTIMECHECK, LOG_INFO,
"%s: No baseDN in writespec. Write "
"disabled for %s,%s",
myself, map_name, domain);
break;
}
if (!strcasecmp(dn, t->objectDN->write.base))
break;
dn = t->objectDN->write.base;
}
if ((rc = makeNISObject(0, dn)) == FAILURE) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Unable to create ldap container (dn: %s) "
"for %s,%s", myself, dn, map_name, domain);
return (FAILURE);
}
}
return (SUCCESS);
}
suc_code
make_nis_domain(char *domain, bool_t init_containers) {
if (FALSE == init_containers) {
return (SUCCESS);
}
return (makeNISObject(domain, 0));
}
suc_code
update_netgroup_byxxx(map_ctrl *map) {
char *temp_entries;
char *temp_ttl;
DBM *temp_entries_db;
DBM *temp_ttl_db;
map_ctrl temp_map;
char *myself = "update_netgroup_byxxx";
char *cmdbuf;
int cmd_length;
datum key;
map_ctrl *netgroupmap;
int res;
const char *byhost = NETGROUP_BYHOST "_REV" TEMP_POSTFIX;
const char *byuser = NETGROUP_BYUSER "_REV" TEMP_POSTFIX;
const char *temp_file_name;
if (0 == strcmp(map->map_name, NETGROUP_BYHOST))
temp_file_name = byhost;
else
temp_file_name = byuser;
cmd_length = strlen("/usr/sbin/makedbm -u ") +
(strlen(map->map_path) - strlen(map->map_name)) +
strlen(NETGROUP_MAP) +
strlen(" | /usr/sbin/revnetgroup -h > ") +
(strlen(map->map_path) - strlen(map->map_name)) +
strlen(temp_file_name) + 1;
cmdbuf = am(myself, cmd_length);
if (NULL == cmdbuf) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Could not alloc cmdbuf.", myself);
return (FAILURE);
}
strlcpy(cmdbuf, map->map_path, strlen(map->map_path) -
strlen(map->map_name) + 1);
strcat(cmdbuf, NETGROUP_MAP);
netgroupmap = (map_ctrl *)shim_dbm_open(cmdbuf,
O_RDWR | O_CREAT, 0644);
if (NULL == netgroupmap) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Could not update %s.", myself, cmdbuf);
sfree(cmdbuf);
return (FAILURE);
}
if (has_map_expired(netgroupmap)) {
lock_map_ctrl(netgroupmap);
update_map_if_required(netgroupmap, TRUE);
unlock_map_ctrl(netgroupmap);
}
shim_dbm_close((DBM *)netgroupmap);
strcpy(cmdbuf, "/usr/sbin/makedbm -u ");
strncat(cmdbuf, map->map_path, strlen(map->map_path) -
strlen(map->map_name));
strcat(cmdbuf, NETGROUP_MAP);
if (0 == strcmp(map->map_name, NETGROUP_BYHOST)) {
strcat(cmdbuf, " | /usr/sbin/revnetgroup -h > ");
} else {
strcat(cmdbuf, " | /usr/sbin/revnetgroup -u > ");
}
strncat(cmdbuf, map->map_path, strlen(map->map_path) -
strlen(map->map_name));
strcat(cmdbuf, temp_file_name);
if (0 > system(cmdbuf)) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not run \"%s\" "
"(errno=%d)", myself, cmdbuf, errno);
sfree(cmdbuf);
return (FAILURE);
}
sfree(cmdbuf);
if (SUCCESS != alloc_temp_names(map->map_path,
&temp_entries, &temp_ttl)) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Unable to create map names for %s",
myself, map->map_path);
return (FAILURE);
}
cmdbuf = am(myself, strlen("/usr/sbin/makedbm") +
(strlen(map->map_path) - strlen(map->map_name)) +
strlen(temp_file_name) +
strlen(temp_entries) + 3);
if (NULL == cmdbuf) {
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Could not allocate cmdbuf.", myself);
sfree(temp_entries);
sfree(temp_ttl);
return (FAILURE);
}
strcpy(cmdbuf, "/usr/sbin/makedbm ");
strncat(cmdbuf, map->map_path, strlen(map->map_path) -
strlen(map->map_name));
strcat(cmdbuf, temp_file_name);
strcat(cmdbuf, " ");
strcat(cmdbuf, temp_entries);
if (0 > system(cmdbuf)) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not run \"%s\" "
"(errno=%d)", myself, cmdbuf, errno);
sfree(cmdbuf);
sfree(temp_entries);
sfree(temp_ttl);
return (FAILURE);
}
strlcpy(cmdbuf, map->map_path, strlen(map->map_path) -
strlen(map->map_name) + 1);
strcat(cmdbuf, temp_file_name);
res = unlink(cmdbuf);
if ((0 != res) && (ENOENT != errno)) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not delete \"%s\" "
"(errno=%d)", myself, cmdbuf, errno);
sfree(temp_entries);
sfree(temp_ttl);
sfree(cmdbuf);
return (FAILURE);
}
sfree(cmdbuf);
if ((temp_entries_db = dbm_open(temp_entries, O_RDWR | O_CREAT, 0644))
== NULL) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not open %s",
myself, temp_entries);
sfree(temp_entries);
sfree(temp_ttl);
return (FAILURE);
}
if ((temp_ttl_db = dbm_open(temp_ttl, O_RDWR | O_CREAT, 0644))
== NULL) {
logmsg(MSG_NOTIMECHECK, LOG_ERR, "%s: Could not open %s",
myself, temp_ttl);
dbm_close(temp_entries_db);
sfree(temp_entries);
sfree(temp_ttl);
return (FAILURE);
}
temp_map.map_name = NETGROUP_MAP;
temp_map.domain = map->domain;
temp_map.ttl = temp_ttl_db;
key = dbm_firstkey(temp_entries_db);
while (key.dptr != 0) {
if (!is_special_key(&key))
if (FAILURE == update_entry_ttl(&temp_map, &key,
TTL_MAX))
logmsg(MSG_NOTIMECHECK, LOG_ERR,
"%s: Could not update TTL for "
"(key=%s) for map %s,%s",
myself, NIL(key.dptr), map->map_name,
map->domain);
key = dbm_nextkey(temp_entries_db);
}
update_map_ttl(&temp_map);
dbm_close(temp_entries_db);
dbm_close(temp_ttl_db);
lock_map_ctrl(map);
rename_map(temp_entries, map->map_path, FALSE);
rename_map(temp_ttl, map->ttl_path, FALSE);
sfree(temp_entries);
sfree(temp_ttl);
unlock_map_ctrl(map);
return (SUCCESS);
}