aboutsummaryrefslogtreecommitdiff
path: root/nss
diff options
context:
space:
mode:
Diffstat (limited to 'nss')
-rw-r--r--nss/getent.c186
-rw-r--r--nss/nss_files/files-network.c32
2 files changed, 129 insertions, 89 deletions
diff --git a/nss/getent.c b/nss/getent.c
index 4c8438f558..1ddd67ad23 100644
--- a/nss/getent.c
+++ b/nss/getent.c
@@ -50,10 +50,21 @@ void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
/* Short description of parameters. */
static const char args_doc[] = N_("database [key ...]");
+/* Supported options. */
+static const struct argp_option args_options[] =
+ {
+ { "service", 's', "CONFIG", 0, N_("Service configuration to be used") },
+ { NULL, 0, NULL, 0, NULL },
+ };
+
+/* Prototype for option handler. */
+static error_t parse_option (int key, char *arg, struct argp_state *state);
+
/* Data structure to communicate with argp functions. */
-static struct argp argp = {
- NULL, NULL, args_doc, NULL,
-};
+static struct argp argp =
+ {
+ args_options, parse_option, args_doc, NULL,
+ };
/* Print the version information. */
static void
@@ -76,11 +87,9 @@ print_aliases (struct aliasent *alias)
printf ("%s: ", alias->alias_name);
for (i = strlen (alias->alias_name); i < 14; ++i)
- fputs (" ", stdout);
+ fputs_unlocked (" ", stdout);
- for (i = 0;
- i < alias->alias_members_len;
- ++i)
+ for (i = 0; i < alias->alias_members_len; ++i)
printf ("%s%s",
alias->alias_members [i],
i + 1 == alias->alias_members_len ? "\n" : ", ");
@@ -93,10 +102,10 @@ aliases_keys (int number, char *key[])
int i;
struct aliasent *alias;
- if (!number)
+ if (number == 0)
{
setaliasent ();
- while ((alias = getaliasent()) != NULL)
+ while ((alias = getaliasent ()) != NULL)
print_aliases (alias);
endaliasent ();
return result;
@@ -122,7 +131,7 @@ ethers_keys (int number, char *key[])
int result = 0;
int i;
- if (!number)
+ if (number == 0)
{
fprintf (stderr, _("Enumeration not supported on %s\n"), "ethers");
return 3;
@@ -134,7 +143,7 @@ ethers_keys (int number, char *key[])
char buffer [1024], *p;
ethp = ether_aton (key[i]);
- if (ethp)
+ if (ethp != NULL)
{
if (ether_ntohost (buffer, ethp))
{
@@ -167,16 +176,16 @@ print_group (struct group *grp)
printf ("%s:%s:%ld:", grp->gr_name ? grp->gr_name : "",
grp->gr_passwd ? grp->gr_passwd : "",
- (unsigned long)grp->gr_gid);
+ (unsigned long int) grp->gr_gid);
while (grp->gr_mem[i] != NULL)
{
- fputs (grp->gr_mem[i], stdout);
+ fputs_unlocked (grp->gr_mem[i], stdout);
++i;
if (grp->gr_mem[i] != NULL)
- fputs (",", stdout);
+ putchar_unlocked (',');
}
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
static int
@@ -186,10 +195,10 @@ group_keys (int number, char *key[])
int i;
struct group *grp;
- if (!number)
+ if (number == 0)
{
setgrent ();
- while ((grp = getgrent()) != NULL)
+ while ((grp = getgrent ()) != NULL)
print_group (grp);
endgrent ();
return result;
@@ -220,20 +229,16 @@ print_hosts (struct hostent *host)
const char *ip = inet_ntop (host->h_addrtype, host->h_addr_list[0],
buf, sizeof (buf));
- fputs (ip, stdout);
- for (i = strlen (ip); i < 15; ++i)
- fputs (" ", stdout);
- fputs (" ", stdout);
- fputs (host->h_name, stdout);
+ printf ("%-15s %s", ip, host->h_name);
i = 0;
while (host->h_aliases[i] != NULL)
{
- fputs (" ", stdout);
- fputs (host->h_aliases[i], stdout);
+ putchar_unlocked (' ');
+ fputs_unlocked (host->h_aliases[i], stdout);
++i;
}
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
static int
@@ -243,10 +248,10 @@ hosts_keys (int number, char *key[])
int i;
struct hostent *host;
- if (!number)
+ if (number == 0)
{
sethostent (0);
- while ((host = gethostent()) != NULL)
+ while ((host = gethostent ()) != NULL)
print_hosts (host);
endhostent ();
return result;
@@ -285,9 +290,9 @@ static int
netgroup_keys (int number, char *key[])
{
int result = 0;
- int i, j;
+ int i;
- if (!number)
+ if (number == 0)
{
fprintf (stderr, _("Enumeration not supported on %s\n"), "netgroup");
return 3;
@@ -301,13 +306,11 @@ netgroup_keys (int number, char *key[])
{
char *p[3];
- fputs (key[i], stdout);
- for (j = strlen (key[i]); j < 21; ++j)
- fputs (" ", stdout);
+ printf ("%-21s", key[i]);
while (getnetgrent (p, p + 1, p + 2))
printf (" (%s, %s, %s)", p[0] ?: " ", p[1] ?: "", p[2] ?: "");
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
}
@@ -322,21 +325,18 @@ print_networks (struct netent *net)
struct in_addr ip;
ip.s_addr = htonl (net->n_net);
- printf ("%s ", net->n_name);
- for (i = strlen (net->n_name); i < 21; ++i)
- fputs (" ", stdout);
- fputs (inet_ntoa (ip), stdout);
+ printf ("%-21s %s", net->n_name, inet_ntoa (ip));
i = 0;
while (net->n_aliases[i] != NULL)
{
- fputs (" ", stdout);
- fputs (net->n_aliases[i], stdout);
+ putchar_unlocked (' ');
+ fputs_unlocked (net->n_aliases[i], stdout);
++i;
if (net->n_aliases[i] != NULL)
- fputs (",", stdout);
+ putchar_unlocked (',');
}
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
static int
@@ -346,10 +346,10 @@ networks_keys (int number, char *key[])
int i;
struct netent *net;
- if (!number)
+ if (number == 0)
{
setnetent (0);
- while ((net = getnetent()) != NULL)
+ while ((net = getnetent ()) != NULL)
print_networks (net);
endnetent ();
return result;
@@ -378,8 +378,8 @@ print_passwd (struct passwd *pwd)
printf ("%s:%s:%ld:%ld:%s:%s:%s\n",
pwd->pw_name ? pwd->pw_name : "",
pwd->pw_passwd ? pwd->pw_passwd : "",
- (unsigned long)pwd->pw_uid,
- (unsigned long)pwd->pw_gid,
+ (unsigned long int) pwd->pw_uid,
+ (unsigned long int) pwd->pw_gid,
pwd->pw_gecos ? pwd->pw_gecos : "",
pwd->pw_dir ? pwd->pw_dir : "",
pwd->pw_shell ? pwd->pw_shell : "");
@@ -392,10 +392,10 @@ passwd_keys (int number, char *key[])
int i;
struct passwd *pwd;
- if (!number)
+ if (number == 0)
{
setpwent ();
- while ((pwd = getpwent()) != NULL)
+ while ((pwd = getpwent ()) != NULL)
print_passwd (pwd);
endpwent ();
return result;
@@ -423,19 +423,16 @@ print_protocols (struct protoent *proto)
{
unsigned int i;
- fputs (proto->p_name, stdout);
- for (i = strlen (proto->p_name); i < 21; ++i)
- fputs (" ", stdout);
- printf (" %d", proto->p_proto);
+ printf ("%-21s %d", proto->p_name, proto->p_proto);
i = 0;
while (proto->p_aliases[i] != NULL)
{
- fputs (" ", stdout);
- fputs (proto->p_aliases[i], stdout);
+ putchar_unlocked (' ');
+ fputs_unlocked (proto->p_aliases[i], stdout);
++i;
}
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
static int
@@ -445,10 +442,10 @@ protocols_keys (int number, char *key[])
int i;
struct protoent *proto;
- if (!number)
+ if (number == 0)
{
setprotoent (0);
- while ((proto = getprotoent()) != NULL)
+ while ((proto = getprotoent ()) != NULL)
print_protocols (proto);
endprotoent ();
return result;
@@ -476,14 +473,12 @@ print_rpc (struct rpcent *rpc)
{
int i;
- fputs (rpc->r_name, stdout);
- for (i = strlen (rpc->r_name); i < 15; ++i)
- fputs (" ", stdout);
- printf (" %d%s", rpc->r_number, rpc->r_aliases[0] ? " " : "");
+ printf ("%-15s %d%s",
+ rpc->r_name, rpc->r_number, rpc->r_aliases[0] ? " " : "");
for (i = 0; rpc->r_aliases[i]; ++i)
printf (" %s", rpc->r_aliases[i]);
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
static int
@@ -493,10 +488,10 @@ rpc_keys (int number, char *key[])
int i;
struct rpcent *rpc;
- if (!number)
+ if (number == 0)
{
setrpcent (0);
- while ((rpc = getrpcent()) != NULL)
+ while ((rpc = getrpcent ()) != NULL)
print_rpc (rpc);
endrpcent ();
return result;
@@ -524,19 +519,16 @@ print_services (struct servent *serv)
{
unsigned int i;
- fputs (serv->s_name, stdout);
- for (i = strlen (serv->s_name); i < 21; ++i)
- fputs (" ", stdout);
- printf (" %d/%s", ntohs (serv->s_port), serv->s_proto);
+ printf ("%-21s %d/%s", serv->s_name, ntohs (serv->s_port), serv->s_proto);
i = 0;
while (serv->s_aliases[i] != NULL)
{
- fputs (" ", stdout);
- fputs (serv->s_aliases[i], stdout);
+ putchar_unlocked (' ');
+ fputs_unlocked (serv->s_aliases[i], stdout);
++i;
}
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
}
static int
@@ -549,7 +541,7 @@ services_keys (int number, char *key[])
if (!number)
{
setservent (0);
- while ((serv = getservent()) != NULL)
+ while ((serv = getservent ()) != NULL)
print_services (serv);
endservent ();
return result;
@@ -620,10 +612,10 @@ print_shadow (struct spwd *sp)
sp->sp_namp ? sp->sp_namp : "",
sp->sp_pwdp ? sp->sp_pwdp : "");
-#define SHADOW_FIELD(n) \
- if (sp->n == -1) \
- fputs (":", stdout); \
- else \
+#define SHADOW_FIELD(n) \
+ if (sp->n == -1) \
+ putchar_unlocked (':'); \
+ else \
printf ("%ld:", sp->n)
SHADOW_FIELD (sp_lstchg);
@@ -633,7 +625,7 @@ print_shadow (struct spwd *sp)
SHADOW_FIELD (sp_inact);
SHADOW_FIELD (sp_expire);
if (sp->sp_flag == ~0ul)
- fputs ("\n", stdout);
+ putchar_unlocked ('\n');
else
printf ("%lu\n", sp->sp_flag);
}
@@ -644,12 +636,12 @@ shadow_keys (int number, char *key[])
int result = 0;
int i;
- if (!number)
+ if (number == 0)
{
struct spwd *sp;
setspent ();
- while ((sp = getspent()) != NULL)
+ while ((sp = getspent ()) != NULL)
print_shadow (sp);
endpwent ();
return result;
@@ -689,9 +681,28 @@ D(rpc)
D(services)
D(shadow)
#undef D
- { NULL, NULL }
+ { NULL, NULL }
};
+/* Handle arguments found by argp. */
+static error_t
+parse_option (int key, char *arg, struct argp_state *state)
+{
+ int i;
+ switch (key)
+ {
+ case 's':
+ for (i = 0; databases[i].name; ++i)
+ __nss_configure_lookup (databases[i].name, arg);
+ break;
+
+ default:
+ return ARGP_ERR_UNKNOWN;
+ }
+
+ return 0;
+}
+
/* build doc */
static inline void
build_doc (void)
@@ -707,7 +718,7 @@ build_doc (void)
len += strlen (databases[i].name) + 1;
doc = (char *) malloc (len);
- if (!doc)
+ if (doc == NULL)
doc = short_doc;
else
{
@@ -719,9 +730,9 @@ build_doc (void)
for (i = 0, j = 0; databases[i].name; ++i)
{
len = strlen (databases[i].name);
- if (i)
+ if (i != 0)
{
- if (j + len > 60)
+ if (j + len > 72)
{
j = 0;
*p++ = '\n';
@@ -730,8 +741,7 @@ build_doc (void)
*p++ = ' ';
}
- memcpy (p, databases[i].name, len);
- p += len;
+ p = mempcpy (p, databases[i].name, len);
j += len + 1;
}
}
@@ -764,11 +774,11 @@ main (int argc, char *argv[])
}
for (i = 0; databases[i].name; ++i)
- if (argv[1][0] == databases[i].name[0]
- && !strcmp (argv[1], databases[i].name))
- return databases[i].func (argc - 2, &argv[2]);
+ if (argv[remaining][0] == databases[i].name[0]
+ && !strcmp (argv[remaining], databases[i].name))
+ return databases[i].func (argc - remaining - 1, &argv[remaining + 1]);
- fprintf (stderr, _("Unknown database: %s\n"), argv[1]);
+ fprintf (stderr, _("Unknown database: %s\n"), argv[remaining]);
argp_help (&argp, stdout, ARGP_HELP_SEE, program_invocation_short_name);
return 1;
}
diff --git a/nss/nss_files/files-network.c b/nss/nss_files/files-network.c
index 383f68fe99..9f4a3e0324 100644
--- a/nss/nss_files/files-network.c
+++ b/nss/nss_files/files-network.c
@@ -1,5 +1,5 @@
/* Networks file parser in nss_files module.
- Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1997, 1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -34,10 +34,40 @@ LINE_PARSER
("#",
{
char *addr;
+ char *cp;
+ int n = 1;
STRING_FIELD (result->n_name, isspace, 1);
STRING_FIELD (addr, isspace, 1);
+ /* 'inet_network' does not add zeroes at the end if the network number
+ does not four byte values. We add them outselves if necessary. */
+ cp = strchr (addr, '.');
+ if (cp != NULL)
+ {
+ ++n;
+ cp = strchr (cp + 1, '.');
+ if (cp != NULL)
+ {
+ ++n;
+ cp = strchr (cp + 1, '.');
+ if (cp != NULL)
+ ++n;
+ }
+ }
+ if (n < 4)
+ {
+ char *newp = (char *) alloca (strlen (addr) + (4 - n) * 2 + 1);
+ cp = stpcpy (newp, addr);
+ do
+ {
+ *cp++ = '.';
+ *cp++ = '0';
+ }
+ while (++n < 4);
+ *cp = '\0';
+ addr = newp;
+ }
result->n_net = inet_network (addr);
result->n_addrtype = AF_INET;