Mailinglist Archive: yast-devel (17 mails)

< Previous Next >
[yast-devel] Re: own server component in YaST, symbol not found
  • From: Martin Vidner <mvidner@xxxxxxx>
  • Date: Mon, 8 Nov 2010 14:52:40 +0100
  • Message-id: <20101108135240.GD7317@xxxxxxxxxxxxxxxx>
(full quote for the list)

On Sun, Nov 07, 2010 at 12:09:22AM +0100, Pavel Nemec wrote:
Hi Martin,
today I finaly find sime time to dig into Yast again.

I realize that I will need my own starter. It is because I need to set
communication handler and doing that when UI start is overhead. (and I also
need to start it from linked program and not as external app)

So I am trying to create my own genericsfrontend.cc Which at the and wasn`t
so
hard.

Problem is that for some reason I cant load client from "ycp".
Y2Component *client = Y2ComponentBroker::createClient(client_name);

will print into logs that it only look in pathsearch.cc(findy2exe) and
pathsearch.cc(findy2plugin)

For some reason Y2CCWFM.cc do not kick in and client is always null.

I looked into genericsfrontend.cc how path is created, but I only fond

YCPPathSearch::initialize();

Which I am using too.

Hi Pavel,

the problem is that, contrary to expectations, the WFM plugin needs
to be linked explicitly to the executable.

I am attaching a modified version of your source which I have
successfully compiled and run. See the inlined compilation command
there.
Also compare how we link the actual y2base program:
http://svn.opensuse.org/svn/yast/trunk/core/base/src/Makefile.am

Good luck with your work. I've connected to you on GTalk and I'll
try to hang out on IRC in the evenings too so that we can connect
faster.

Martin

This is log I get with my program:
...
/home/pavel/.yast2/clients_non_y2/nfs
2010-11-06 23:26:54 <0> deepblue(26442) [libycp] pathsearch.cc(findy2exe):210
Trying file /home/pavel/.yast2/clients/nfs
2010-11-06 23:26:54 <0> deepblue(26442) [libycp]
pathsearch.cc(findy2plugin):233 Testing existence of plugin
/usr/lib/YaST2/plugin/libpy2nfs.so.2
2010-11-06 23:26:54 <0> deepblue(26442) [libycp] pathsearch.cc(findy2exe):210
Trying file /usr/lib/YaST2/clients_non_y2/nfs
2010-11-06 23:26:54 <0> deepblue(26442) [libycp] pathsearch.cc(findy2exe):210
Trying file /usr/lib/YaST2/clients/nfs
2010-11-06 23:26:54 <3> deepblue(26442) [CustomLoader]
loader/CustomLoader.cpp(main):39 client is null, exiting


This is how it should look like:
...2010-11-06 23:26:21 <0> deepblue(26415) [wfm] Y2CCWFM.cc(createInLevel):67
Trying to create nfs
2010-11-06 23:26:21 <0> deepblue(26415) [libycp] pathsearch.cc(findy2exe):210
Trying file /y2update/clients_non_y2/nfs
2010-11-06 23:26:21 <0> deepblue(26415) [libycp] pathsearch.cc(findy2exe):210
Trying file /y2update/clients/nfs
2010-11-06 23:26:21 <0> deepblue(26415) [libycp]
pathsearch.cc(findy2plugin):233 Testing existence of plugin
/home/pavel/.yast2/plugin/libpy2nfs.so.2
2010-11-06 23:26:21 <0> deepblue(26415) [wfm] Y2CCWFM.cc(createInLevel):67
Trying to create nfs
2010-11-06 23:26:21 <0> deepblue(26415) [libycp] pathsearch.cc(findy2exe):210
Trying file /home/pavel/.yast2/clients_non_y2/nfs
2010-11-06 23:26:21 <0> deepblue(26415) [libycp] pathsearch.cc(findy2exe):210
Trying file /home/pavel/.yast2/clients/nfs
2010-11-06 23:26:21 <0> deepblue(26415) [libycp]
pathsearch.cc(findy2plugin):233 Testing existence of plugin


Please use you magic insight and tell me what I am missing to call/set.

Thanks,
Pavel


/*
* CustomLoader.cpp
*
* Created on: Nov 6, 2010
* Author: pavel
*/

#include "CustomLoader.h"



CustomLoader::CustomLoader() {
// TODO Auto-generated constructor stub

}

CustomLoader::~CustomLoader() {
// TODO Auto-generated destructor stub
}

int main(int argc, char **argv) {
char *progname = "CustomLoader";
char *client_name="nfs";
char *server_name = "jast";
char **server_argv = new char *[0];

YCPPathSearch::initialize();
string module = YCPPathSearch::findModule("nfs",true);
y2milestone("Launched YaST2 component '%s' jast", progname);
Y2ComponentBroker::getNamespaceComponent("UI");
Y2Component *server = Y2ComponentBroker::createServer(server_name);
server->setServerOptions(0, server_argv);
Y2Component *client = Y2ComponentBroker::createClient(client_name);

if(!server){
y2error("server is null, exiting");
exit(1);
}
if(!client){
y2error("client is null, exiting");
exit(1);
}

setenv("YAST_IS_RUNNING", "instsys", 1);
y2milestone("YAST_IS_RUNNING is %s", getenv("YAST_IS_RUNNING"));

YCPList arglist;
YCPValue result = client->doActualWork(arglist, server);
server->result(result);

// Cleanup
delete server;
delete[] server_argv;
delete client;

// might be useful in tracking segmentation faults
y2milestone("Finished YaST2 component '%s'", progname);

if (result.isNull())
exit(0);

y2milestone("Exiting with client return value '%s'",
result->toString().c_str());
}

--
Martin Vidner, YaST developer
http://en.opensuse.org/User:Mvidner

Kuracke oddeleni v restauraci je jako fekalni oddeleni v bazenu
/*
* CustomLoader.cpp
*
* Created on: Nov 6, 2010
* Author: pavel
* Edited to make it work, mvidner
*/

// This links OK but y2log will say
// CustomLoader.cpp(main):36 client is null, exiting
// g++ -I /usr/include/YaST2 -lycp ly2 CustomLoader.cpp

// WFM needs to be linked in:
// g++ -I /usr/include/YaST2 -L /usr/lib/YaST2/plugin -Wl,-rpath
/usr/lib/YaST2/plugin -lpy2wfm -lycp -ly2 CustomLoader.cpp

#include <YCP.h>
#include <Y2.h>
#include <ycp/pathsearch.h>
#define Y2LOG "Custom"
#include <ycp/y2log.h>


int main(int argc, char **argv) {
char *progname = "CustomLoader";
char *client_name="nfs";
char *server_name = "qt";
char **server_argv = new char *[0];

YCPPathSearch::initialize();
string module = YCPPathSearch::findModule("nfs",true);
y2milestone("Launched YaST2 component '%s' jast", progname);
Y2ComponentBroker::getNamespaceComponent("UI");
Y2Component *server = Y2ComponentBroker::createServer(server_name);
server->setServerOptions(0, server_argv);
Y2Component *client = Y2ComponentBroker::createClient(client_name);

if(!server){
y2error("server is null, exiting");
exit(1);
}
if(!client){
y2error("client is null, exiting");
exit(1);
}

setenv("YAST_IS_RUNNING", "instsys", 1);
y2milestone("YAST_IS_RUNNING is %s", getenv("YAST_IS_RUNNING"));

YCPList arglist;
YCPValue result = client->doActualWork(arglist, server);
server->result(result);

// Cleanup
delete server;
delete[] server_argv;
delete client;

// might be useful in tracking segmentation faults
y2milestone("Finished YaST2 component '%s'", progname);

if (result.isNull())
exit(0);

y2milestone("Exiting with client return value '%s'",
result->toString().c_str());
}
< Previous Next >
This Thread