Issue: #137, Parse /etc/hosts file.

This commit is contained in:
QC 2015-03-29 12:27:00 +02:00
parent a083e21a6b
commit 55160c6eff
6 changed files with 97 additions and 6 deletions

View File

@ -104,6 +104,7 @@ Settings config = {
/** Lazy mode setting */ /** Lazy mode setting */
.lazy_filter_limit = 5000, .lazy_filter_limit = 5000,
/** auto select */ /** auto select */
.auto_select = FALSE .auto_select = FALSE,
.parse_hosts = FALSE
}; };

View File

@ -44,6 +44,7 @@ rofi - A window switcher, run dialog and dmenu replacement
[ -help] [ -help]
[ -dump-xresources ] [ -dump-xresources ]
[ -auto-select ] [ -auto-select ]
[ -parse-hosts ]
## DESCRIPTION ## DESCRIPTION
@ -300,6 +301,11 @@ daemon listening to specific key-combinations.
Default: *{terminal} -e {ssh-client} {host}* Default: *{terminal} -e {ssh-client} {host}*
`-parse-hosts`
Parse the `/etc/hosts` files for entries.
### Run settings ### Run settings
`-run-command` *cmd* `-run-command` *cmd*

View File

@ -42,6 +42,7 @@ rofi \- A window switcher, run dialog and dmenu replacement
[ \-help] [ \-help]
[ \-dump\-xresources ] [ \-dump\-xresources ]
[ \-auto\-select ] [ \-auto\-select ]
[ \-parse\-hosts ]
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
\fBrofi\fP is an X11 popup window switcher, run dialog, dmenu replacement and more. It focusses on \fBrofi\fP is an X11 popup window switcher, run dialog, dmenu replacement and more. It focusses on
@ -378,6 +379,14 @@ Set the command to execute when starting a ssh session.
The pattern \fI{host}\fP is replaced by the selected ssh entry. The pattern \fI{host}\fP is replaced by the selected ssh entry.
.IP .IP
Default: \fI{terminal} \-e {ssh\-client} {host}\fP Default: \fI{terminal} \-e {ssh\-client} {host}\fP
.PP
\fB\fC\-parse\-hosts\fR
.PP
.RS
.nf
Parse the `/etc/hosts` files for entries.
.fi
.RE
.SS Run settings .SS Run settings
.PP .PP
\fB\fC\-run\-command\fR \fIcmd\fP \fB\fC\-run\-command\fR \fIcmd\fP
@ -607,14 +616,18 @@ Check quotes used on the commandline: e.g. used “ instead of ".
.SH WEBSITE .SH WEBSITE
.PP .PP
\fBrofi\fP website can be found at here \fBrofi\fP website can be found at here
\[la]https://davedavenport.github.io/rofi/\[ra] .UR https://davedavenport.github.io/rofi/
.UE
.PP .PP
\fBrofi\fP bugtracker can be found here \fBrofi\fP bugtracker can be found here
\[la]https://github.com/DaveDavenport/rofi/issues\[ra] .UR https://github.com/DaveDavenport/rofi/issues
.UE
.SH AUTHOR .SH AUTHOR
.PP .PP
Qball Cow Qball Cow
\[la]qball@gmpclient.org\[ra] .MT qball@gmpclient.org
.ME
.PP .PP
Original code based on work by: Sean Pringle Original code based on work by: Sean Pringle
\[la]sean.pringle@gmail.com\[ra] .MT sean.pringle@gmail.com
.ME

View File

@ -201,6 +201,8 @@ typedef struct _Settings
unsigned int lazy_filter_limit; unsigned int lazy_filter_limit;
/** Auto select. */ /** Auto select. */
unsigned int auto_select; unsigned int auto_select;
/** Hosts file parsing */
unsigned int parse_hosts;
} Settings; } Settings;
/** Global Settings structure. */ /** Global Settings structure. */

View File

@ -109,6 +109,70 @@ static int ssh_sort_func ( const void *a, const void *b )
const char *bstr = *( const char * const * ) b; const char *bstr = *( const char * const * ) b;
return g_utf8_collate ( astr, bstr ); return g_utf8_collate ( astr, bstr );
} }
/**
* Read /etc/hosts
*/
static char **read_hosts_file ( char ** retv, unsigned int *length )
{
// Read the hosts file.
FILE *fd = fopen ( "/etc/hosts", "r" );
if ( fd != NULL ) {
char buffer[1024];
// Reading one line per time.
while ( fgets ( buffer, sizeof ( buffer ), fd ) ) {
// Evaluate one line.
unsigned int index = 0, ti = 0;
char *token = buffer;
// Tokenize it.
do {
char c = buffer[index];
// Break on space, tab, newline and \0.
if ( c == ' ' || c == '\t' || c == '\n' || c == '\0' || c == '#' ) {
buffer[index] = '\0';
// Ignore empty tokens
if ( token[0] != '\0' ) {
ti++;
// and first token.
if ( ti > 1 ) {
// Is this host name already in the list?
// We often get duplicates in hosts file, so lets check this.
int found = 0;
for ( unsigned int j = 0; j < ( *length ); j++ ) {
if ( !g_ascii_strcasecmp ( token, retv[j] ) ) {
found = 1;
break;
}
}
if ( !found ) {
// Add this host name to the list.
retv = g_realloc ( retv,
( ( *length ) + 2 ) * sizeof ( char* ) );
retv[( *length )] = g_strdup ( token );
retv[( *length ) + 1] = NULL;
( *length )++;
}
}
}
// Set start to next element.
token = &buffer[index + 1];
// Everything after comment ignore.
if ( c == '#' ) {
break;
}
}
// Skip to the next entry.
index++;
} while ( buffer[index] != '\0' && buffer[index] != '#' );
}
fclose ( fd );
}
return retv;
}
static char ** get_ssh ( unsigned int *length ) static char ** get_ssh ( unsigned int *length )
{ {
char **retv = NULL; char **retv = NULL;
@ -124,6 +188,10 @@ static char ** get_ssh ( unsigned int *length )
g_free ( path ); g_free ( path );
num_favorites = ( *length ); num_favorites = ( *length );
if ( config.parse_hosts == TRUE ) {
retv = read_hosts_file ( retv, length );
}
FILE *fd = NULL; FILE *fd = NULL;
const char *hd = getenv ( "HOME" ); const char *hd = getenv ( "HOME" );
path = g_strdup_printf ( "%s/%s", hd, ".ssh/config" ); path = g_strdup_printf ( "%s/%s", hd, ".ssh/config" );

View File

@ -104,7 +104,8 @@ static XrmOption xrmOptions[] = {
{ xrm_Boolean, "sidebar-mode", { .num = &config.sidebar_mode }, NULL }, { xrm_Boolean, "sidebar-mode", { .num = &config.sidebar_mode }, NULL },
{ xrm_Number, "lazy-filter-limit", { .num = &config.lazy_filter_limit }, NULL }, { xrm_Number, "lazy-filter-limit", { .num = &config.lazy_filter_limit }, NULL },
{ xrm_SNumber, "eh", { .snum = &config.element_height }, NULL }, { xrm_SNumber, "eh", { .snum = &config.element_height }, NULL },
{ xrm_Boolean, "auto-select", { .num = &config.auto_select }, NULL } { xrm_Boolean, "auto-select", { .num = &config.auto_select }, NULL },
{ xrm_Boolean, "parse-hosts", { .num = &config.parse_hosts }, NULL }
}; };
// Dynamic options. // Dynamic options.