env.c
author Myhailo Danylenko <isbear@ukrpost.net>
Fri, 13 Nov 2009 17:48:13 +0200
changeset 3 490c62fe90eb
parent 0 53ef7728edcf
child 4 2c5225ab6eb7
permissions -rw-r--r--
Added command cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     1
/*
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     2
 * env.c                -- Tampering with mcabber's environment
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     3
 *
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     4
 * Copyrigth (C) 2009      Myhailo Danylenko <isbear@ukrpost.net>
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     5
 *
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     6
 * This program is free software; you can redistribute it and/or modify
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     7
 * it under the terms of the GNU General Public License as published by
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     8
 * the Free Software Foundation; either version 2 of the License, or (at
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
     9
 * your option) any later version.
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    10
 *
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    11
 * This program is distributed in the hope that it will be useful, but
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    12
 * WITHOUT ANY WARRANTY; without even the implied warranty of
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    14
 * General Public License for more details.
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    15
 *
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    16
 * You should have received a copy of the GNU General Public License
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    17
 * along with this program; if not, write to the Free Software
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    18
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    19
 * USA
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    20
 */
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    21
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    22
#include <glib.h>
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    23
#include <gmodule.h>
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    24
#include <string.h>
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    25
#include <stdlib.h>
3
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    26
#include <unistd.h>
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
    27
#include <errno.h>
0
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    28
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    29
#include "utils.h"
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    30
#include "compl.h"
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    31
#include "logprint.h"
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    32
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    33
extern char **environ;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    34
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    35
// /env [option] [value]
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    36
static void do_env (char *arg)
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    37
{
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    38
	char **args = split_arg (arg, 2, 1);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    39
	char  *var  = args[0];
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    40
	char  *val;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    41
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    42
	if (var)
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    43
		val = args[1];
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    44
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    45
	if (!var) {
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    46
		// print full variables list
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    47
		GSList  *vars   = NULL;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    48
		int      max    = 0;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    49
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    50
		{
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    51
			char   **envvar;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    52
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    53
			for (envvar = environ; *envvar; ++envvar) {
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    54
				char *end = strchr (*envvar, '=');
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    55
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    56
				if (end) {
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    57
					int   len  = end - *envvar;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    58
					char *name = g_strndup (*envvar, len);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    59
	
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    60
					if (len > max)
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    61
						max = len;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    62
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    63
					vars = g_slist_prepend (vars, name);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    64
				}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    65
			}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    66
		}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    67
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    68
		if (max) {
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    69
			gchar  *format = g_strdup_printf ("%%-%ds = %%s", max);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    70
			GSList *eel;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    71
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    72
			vars = g_slist_sort (vars, (GCompareFunc) strcmp);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    73
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    74
			for (eel = vars; eel; eel = eel->next) {
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    75
				char *name  = (char *) eel->data;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    76
				char *value = getenv (name);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    77
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    78
				scr_LogPrint (LPRINT_NORMAL, format, name, value);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    79
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    80
				g_free (name);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    81
			}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    82
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    83
			g_free (format);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    84
		}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    85
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    86
		g_slist_free (vars);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    87
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    88
	} else if (!val) {
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    89
		// print variable alone
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    90
		char *value = getenv (var);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    91
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    92
		if (value)
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    93
			scr_LogPrint (LPRINT_NORMAL, "%s = %s", var, value);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    94
	} else
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    95
		// set variable
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    96
		setenv (var, val, 1);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    97
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    98
	free_arg_lst (args);
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
    99
}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   100
3
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   101
// /cd [path]
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   102
static void do_cd (char *arg)
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   103
{
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   104
	if (!*arg) { // get
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   105
		char cwd[256];
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   106
		if (getcwd (cwd, 256) == NULL)
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   107
			scr_LogPrint (LPRINT_NORMAL, "Cannot obtain current working directory: %s.", strerror (errno));
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   108
		else
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   109
			scr_LogPrint (LPRINT_NORMAL, "%s", cwd);
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   110
	} else if (chdir (arg) == -1) // set
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   111
		scr_LogPrint (LPRINT_NORMAL, "Cannot change current working directory: %s.", strerror (errno));
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   112
}
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   113
0
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   114
const gchar *g_module_check_init(GModule *module)
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   115
{
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   116
	// command
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   117
	cmd_add ("env", "", 0, 0, do_env, NULL);
3
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   118
	cmd_add ("cd", "", COMPL_FILENAME, 0, do_cd, NULL);
0
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   119
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   120
	return NULL;
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   121
}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   122
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   123
void g_module_unload(GModule *module)
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   124
{
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   125
	// command
3
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   126
	cmd_del ("cd");
0
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   127
	cmd_del ("env");
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   128
}
53ef7728edcf Initial commit
Myhailo Danylenko <isbear@ukrpost.net>
parents:
diff changeset
   129
3
490c62fe90eb Added command cd
Myhailo Danylenko <isbear@ukrpost.net>
parents: 0
diff changeset
   130
/* vim: se ts=4 sw=4: */