mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-18 13:54:36 -05:00
Issue: #137, Parse /etc/hosts file.
This commit is contained in:
parent
a083e21a6b
commit
55160c6eff
6 changed files with 97 additions and 6 deletions
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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*
|
||||||
|
|
21
doc/rofi.1
21
doc/rofi.1
|
@ -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
|
||||||
|
|
|
@ -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. */
|
||||||
|
|
|
@ -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" );
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in a new issue