void env_universal_set( const wcstring &name, const wcstring &value, int exportv )
{
	message_t *msg;
	
	if( !init )
		return;

	debug( 3, L"env_universal_set( \"%ls\", \"%ls\" )", name.c_str(), value.c_str() );

	if( is_dead() )
	{
		env_universal_common_set( name.c_str(), value.c_str(), exportv );
	}
	else
	{
		msg = create_message( exportv?SET_EXPORT:SET, 
							  name.c_str(), 
							  value.c_str());

		if( !msg )
		{
			debug( 1, L"Could not create universal variable message" );
			return;
		}
		
		msg->count=1;
        env_universal_server.unsent->push(msg);
		env_universal_barrier();
	}
}
Exemple #2
0
void env_universal_set(const wcstring &name, const wcstring &value, bool exportv)
{
    if (!s_env_univeral_inited)
        return;

    debug(3, L"env_universal_set( \"%ls\", \"%ls\" )", name.c_str(), value.c_str());

    if (! synchronizes_via_fishd() || is_dead())
    {
        env_universal_common_set(name.c_str(), value.c_str(), exportv);
        env_universal_barrier();
    }
    else
    {
        message_t *msg = create_message(exportv?SET_EXPORT:SET,
                                        name.c_str(),
                                        value.c_str());

        if (!msg)
        {
            debug(1, L"Could not create universal variable message");
            return;
        }

        msg->count=1;
        env_universal_server.unsent.push(msg);
        env_universal_barrier();
    }
}
/**
   Parse message msg
*/
static void parse_message(wchar_t *msg,
                          connection_t *src)
{
//  debug( 3, L"parse_message( %ls );", msg );

    if (msg[0] == L'#')
        return;

    if (match(msg, SET_STR) || match(msg, SET_EXPORT_STR))
    {
        wchar_t *name, *tmp;
        int exportv = match(msg, SET_EXPORT_STR);

        name = msg+(exportv?wcslen(SET_EXPORT_STR):wcslen(SET_STR));
        while (wcschr(L"\t ", *name))
            name++;

        tmp = wcschr(name, L':');
        if (tmp)
        {
            wchar_t *key;
            wchar_t *val;

            key = (wchar_t *)malloc(sizeof(wchar_t)*(tmp-name+1));
            memcpy(key, name, sizeof(wchar_t)*(tmp-name));
            key[tmp-name]=0;

            val = tmp+1;
            val = unescape(val, 0);

            if (key && val)
                env_universal_common_set(key, val, exportv);

            free(val);
            free(key);
        }
        else
        {
            debug(1, PARSE_ERR, msg);
        }
    }
    else if (match(msg, ERASE_STR))
    {
        wchar_t *name, *tmp;

        name = msg+wcslen(ERASE_STR);
        while (wcschr(L"\t ", *name))
            name++;

        tmp = name;
        while (iswalnum(*tmp) || *tmp == L'_')
            tmp++;

        *tmp = 0;

        if (!wcslen(name))
        {
            debug(1, PARSE_ERR, msg);
        }

        env_universal_common_remove(name);

        if (callback)
        {
            callback(ERASE, name, 0);
        }
    }
    else if (match(msg, BARRIER_STR))
    {
        message_t *msg = create_message(BARRIER_REPLY, 0, 0);
        msg->count = 1;
        src->unsent->push(msg);
        try_send_all(src);
    }
    else if (match(msg, BARRIER_REPLY_STR))
    {
        if (callback)
        {
            callback(BARRIER_REPLY, 0, 0);
        }
    }
    else
    {
        debug(1, PARSE_ERR, msg);
    }
}