trunk 20080912
[gitenigma.git] / src / hotplug.cpp
blobf75ddd0d6955732b88f79496449c14b055f2ae40
1 #include "hotplug.h"
3 #include <unistd.h>
4 #include <lib/base/eerror.h>
6 eHotplug *eHotplug::instance = 0;
8 eHotplug::eHotplug()
9 :paramsleft(0)
11 if (!instance)
12 instance=this;
13 else
14 eWarning("MORE THAN ONE INSTANCES OF eHotplug created!!");
15 memset(&servaddr, 0, sizeof(struct sockaddr_un));
16 servaddr.sun_family = AF_UNIX;
17 unlink("/tmp/hotplug.socket");
18 strcpy(servaddr.sun_path, "/tmp/hotplug.socket");
19 clilen = sizeof(servaddr.sun_family) + strlen(servaddr.sun_path);
20 if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
22 perror("[hotplug] socket");
23 return;
25 if (bind(listenfd, (struct sockaddr *) &servaddr, clilen) < 0)
27 perror("[hotplug] bind");
28 return;
30 if (listen(listenfd, 5) < 0)
32 perror("[hotplug] listen");
33 return;
35 sn = new eSocketNotifier( eApp, listenfd, 17 ); // POLLIN/POLLPRI/POLLHUP
36 sn->start();
37 CONNECT( sn->activated, eHotplug::dataAvail );
38 eDebug("[eHotplug] created successfully");
41 void eHotplug::dataAvail(int what)
43 switch(what)
45 case POLLIN:
46 case POLLPRI:
48 unsigned char msgbuffer[1024];
49 int connfd =
50 accept(listenfd, (struct sockaddr *) &servaddr, (socklen_t *) &clilen);
51 ssize_t length = read(connfd, msgbuffer, sizeof(msgbuffer));
52 if ( !length )
53 break;
54 eString tmp((char*)msgbuffer, length);
55 if ( tmp.find("LENGTH = ") != eString::npos )
57 paramsleft=tmp[9];
58 params.clear();
60 else
62 unsigned int pos = tmp.find("=");
63 if ( pos == eString::npos )
64 break;
65 params[tmp.left(pos)]=tmp.mid(pos+1, tmp.length()-pos+1);
66 paramsleft--;
68 close(connfd);
69 if ( !paramsleft )
71 for (std::map<eString,eString>::iterator it( params.begin() ); it != params.end(); it++ )
72 eDebug("%s = %s", it->first.c_str(), it->second.c_str() );
74 break;
76 default:
77 break;
81 eHotplug::~eHotplug()
83 delete sn;
84 unlink("/tmp/hotplug.socket");