tdenetwork/kppp/opener.h

148 lines
3.1 KiB

#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