diff options
Diffstat (limited to 'kppp/opener.h')
-rw-r--r-- | kppp/opener.h | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/kppp/opener.h b/kppp/opener.h new file mode 100644 index 00000000..812ec9ba --- /dev/null +++ b/kppp/opener.h @@ -0,0 +1,147 @@ +#ifndef _FILEOPENER_H_ +#define _FILEOPENER_H_ + +#define DEVNULL "/dev/null" + +// workaround for bug in glibc on RedHat 5.0 and Debian 2.1 +#if defined(__GLIBC__) && (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0 && defined(__linux__)) +# define MY_SCM_RIGHTS 1 +#else +# define MY_SCM_RIGHTS SCM_RIGHTS +#endif + +// ### add by bhughes - FreeBSD defines 'BSD' in sys/param.h +#include <sys/param.h> + +#if defined(BSD) || defined(__svr4__) +# define IOV_BASE_CAST (char *) +#else +# define IOV_BASE_CAST (void *) +#endif + +const char *pppdPath(); + +class Opener { + +public: + Opener(int); + ~Opener(); + + enum { OpenDevice = 1, + OpenLock, RemoveLock, + OpenResolv, + OpenSysLog, + SetSecret, RemoveSecret, + SetHostname, + ExecPPPDaemon, KillPPPDaemon, + PPPDExitStatus, + Stop }; + enum Auth { PAP = 1, CHAP }; + enum { MaxPathLen = 30, MaxStrLen = 40, MaxArgs = 100 }; + +private: + enum { Original=0x100, New=0x200, Old=0x400 } Version; + void mainLoop(); + int sendFD(int ttyfd, struct ResponseHeader *response); + int sendResponse(struct ResponseHeader *response); + const char *deviceByIndex(int idx); + bool createAuthFile(Auth method, char *username, char *password); + bool removeAuthFile(Auth method); + const char* authFile(Auth method, int version = Original); + bool execpppd(const char *arguments); + bool killpppd()const; + void parseargs(char* buf, char** args); + + int socket; + int ttyfd; + char lockfile[MaxPathLen+1]; +}; + + +struct RequestHeader { + int type; + int len; + // int id; // TODO: Use a transmission id and check whether + // response matches request +}; + +struct ResponseHeader { + int status; /* 0 or errno */ + // int id; +}; + +struct OpenModemRequest { + struct RequestHeader header; + int deviceNum; +}; + +struct RemoveLockRequest { + struct RequestHeader header; +}; + +struct OpenLockRequest { + struct RequestHeader header; + int deviceNum; + int flags; +}; + +struct OpenResolvRequest { + struct RequestHeader header; + int flags; +}; + +struct OpenLogRequest { + struct RequestHeader header; +}; + +struct SetSecretRequest { + struct RequestHeader header; + Opener::Auth method; // PAP or CHAP + char username[Opener::MaxStrLen+1]; + char password[Opener::MaxStrLen+1]; +}; + +struct RemoveSecretRequest { + struct RequestHeader header; + Opener::Auth method; // PAP or CHAP +}; + +struct SetHostnameRequest { + struct RequestHeader header; + char name[Opener::MaxStrLen+1]; +}; + +struct ExecDaemonRequest { + struct RequestHeader header; + char arguments[MAX_CMDLEN+1]; +}; + +struct KillDaemonRequest { + struct RequestHeader header; +}; + +struct PPPDExitStatusRequest { + struct RequestHeader header; +}; + +struct StopRequest { + struct RequestHeader header; +}; + +union AllRequests { + struct RequestHeader header; + struct OpenModemRequest modem; + struct OpenLockRequest lock; + struct RemoveLockRequest unlock; + struct OpenResolvRequest resolv; + struct SetSecretRequest secret; + struct RemoveSecretRequest remove; + struct SetHostnameRequest host; + struct OpenLogRequest log; + struct ExecDaemonRequest daemon; + struct ExecDaemonRequest kill; + struct PPPDExitStatusRequest status; + struct StopRequest stop; +}; + +#endif |