blob: 15ee05bf127bdb8485b95e3f2aae3be377bf8eec [file] [log] [blame]
/*
* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <ctype.h>
#include <errno.h>
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mobile_provider.h"
void print_provider(struct mobile_provider *provider)
{
struct mobile_apn *apn;
gchar *networks;
int i, j;
int num_networks;
int namelen, maxnamelen;
int userlen, maxuserlen;
int passlen, maxpasslen;
num_networks = g_strv_length(provider->networks);
printf("\"\033[1;33m%s\033[m\" in country \"\033[1;33m%s\033[m\" has "
"%d network ID%s and %d APN%s%s\n",
provider->names[0]->name,
provider->country,
num_networks,
num_networks == 1 ? "" : "s",
provider->num_apns,
provider->num_apns == 1 ? "" : "s",
provider->primary ? " [\033[1;31mprimary\033[m]" : "");
for (i = 1; i < provider->num_names; i++)
if (provider->names[i]->lang == NULL)
printf(" name: %s\n", provider->names[i]->name);
else
printf(" name: %s lang: %s\n",
provider->names[i]->name,
provider->names[i]->lang);
networks = g_strjoinv(",", provider->networks);
printf(" networks: %s\n", networks);
g_free(networks);
maxnamelen = -1;
maxuserlen = maxpasslen = strlen("<none>");
for (i = 0; i < provider->num_apns; i++) {
apn = provider->apns[i];
namelen = strlen(apn->value);
if (namelen > maxnamelen)
maxnamelen = namelen;
if (apn->username && (userlen = strlen(apn->username)) > maxuserlen)
maxuserlen = userlen;
if (apn->password && (passlen = strlen(apn->password)) > maxpasslen)
passlen = passlen;
}
if (maxuserlen == -1)
maxuserlen = strlen("<none>");
if (maxpasslen == -1)
maxpasslen = strlen("<none>");
for (i = 0; i < provider->num_apns; i++) {
apn = provider->apns[i];
printf(" APN %d: \033[1;32m%-*s\033[m username %-*s password %-*s\n",
i+1,
maxnamelen, apn->value,
maxuserlen, apn->username ? apn->username : "<none>",
maxpasslen, apn->password ? apn->password : "<none>");
for (j = 0; j < apn->num_names; j++)
if (apn->names[j]->lang == NULL)
printf(" name: %s\n", apn->names[j]->name);
else
printf(" name: %s lang; %s\n",
apn->names[j]->name,
apn->names[j]->lang);
}
}
void print_provider_list(struct mobile_provider *provider)
{
while (provider != NULL) {
print_provider(provider);
provider = provider->next;
}
printf("---------------------------------------------------------------\n");
}
void print_network(gchar *network, struct mobile_provider *provider)
{
printf("[%s]: ", network);
print_provider(provider);
printf("---------------------------------------------------------------\n");
}
int main(int argc, const char *argv[])
{
char linebuf[BUFSIZ];
char *line;
struct mobile_provider *provider;
struct mobile_provider_db *provider_db;
if (argc < 2) {
fprintf(stderr, "Usage: %s <filename>\n", argv[0]);
exit(1);
}
provider_db = mobile_provider_open_db(argv[1]);
if (provider_db == NULL) {
perror("Cannot open provider database");
exit(1);
}
while (1) {
int linelen;
printf("Type a network ID or provider name: ");
line = fgets(linebuf, sizeof(linebuf), stdin);
if (line == NULL || line[0] == '\n')
break;
linelen = strlen(line);
if (line[linelen-1] == '\n')
line[--linelen] = '\0';
if ((linelen == 5 || linelen == 6) &&
isdigit(line[0]) && isdigit(line[1]) && isdigit(line[linelen-1])) {
provider = mobile_provider_lookup_by_network(provider_db,
line);
if (provider != NULL)
print_provider(provider);
} else if (line[0] == '*') {
if (line[1] == 'p')
mobile_provider_foreach_provider(provider_db,
print_provider_list);
else if (line[1] == 'n')
mobile_provider_foreach_network(provider_db,
print_network);
else
printf("error: Unknown command \"%s\"\n", line);
continue;
} else {
provider = mobile_provider_lookup_by_name(provider_db,
line);
if (provider != NULL)
print_provider_list(provider);
}
if (provider == NULL)
printf("No provider found for %s\n", line);
}
mobile_provider_close_db(provider_db);
return 0;
}