1#ifndef _FILEOPENER_H_
2#define _FILEOPENER_H_
3
4#define DEVNULL "/dev/null"
5
6// workaround for bug in glibc on RedHat 5.0 and Debian 2.1
7#if defined(__GLIBC__) && (__GLIBC__ == 2 && __GLIBC_MINOR__ == 0 && defined(__linux__))
8# define MY_SCM_RIGHTS 1
9#else
10# define MY_SCM_RIGHTS SCM_RIGHTS
11#endif
12
13// ### add by bhughes - FreeBSD defines 'BSD' in sys/param.h
14#include <sys/param.h>
15
16#if defined(BSD) || defined(__SVR4)
17# define IOV_BASE_CAST (char *)
18#else
19# define IOV_BASE_CAST (void *)
20#endif
21
22const char *pppdPath();
23
24class Opener {
25
26public:
27 Opener(int);
28 ~Opener();
29
30 enum { OpenDevice = 1,
31 OpenLock, RemoveLock,
32 OpenResolv,
33 OpenSysLog,
34 SetSecret, RemoveSecret,
35 SetHostname,
36 ExecPPPDaemon, KillPPPDaemon,
37 PPPDExitStatus,
38 Stop };
39 enum Auth { PAP = 1, CHAP };
40 enum { MaxPathLen = 30, MaxStrLen = 40, MaxArgs = 100 };
41
42private:
43 enum { Original=0x100, New=0x200, Old=0x400 } Version;
44 void mainLoop();
45 int sendFD(int ttyfd, struct ResponseHeader *response);
46 int sendResponse(struct ResponseHeader *response);
47 const char *deviceByIndex(int idx);
48 bool createAuthFile(Auth method, char *username, char *password);
49 bool removeAuthFile(Auth method);
50 const char* authFile(Auth method, int version = Original);
51 bool execpppd(const char *arguments);
52 bool killpppd()const;
53 void parseargs(char* buf, char** args);
54
55 int socket;
56 int ttyfd;
57 char lockfile[MaxPathLen+1];
58};
59
60
61struct RequestHeader {
62 int type;
63 int len;
64 // int id; // TODO: Use a transmission id and check whether
65 // response matches request
66};
67
68struct ResponseHeader {
69 int status; /* 0 or errno */
70 // int id;
71};
72
73struct OpenModemRequest {
74 struct RequestHeader header;
75 int deviceNum;
76};
77
78struct RemoveLockRequest {
79 struct RequestHeader header;
80};
81
82struct OpenLockRequest {
83 struct RequestHeader header;
84 int deviceNum;
85 int flags;
86};
87
88struct OpenResolvRequest {
89 struct RequestHeader header;
90 int flags;
91};
92
93struct OpenLogRequest {
94 struct RequestHeader header;
95};
96
97struct SetSecretRequest {
98 struct RequestHeader header;
99 Opener::Auth method; // PAP or CHAP
100 char username[Opener::MaxStrLen+1];
101 char password[Opener::MaxStrLen+1];
102};
103
104struct RemoveSecretRequest {
105 struct RequestHeader header;
106 Opener::Auth method; // PAP or CHAP
107};
108
109struct SetHostnameRequest {
110 struct RequestHeader header;
111 char name[Opener::MaxStrLen+1];
112};
113
114struct ExecDaemonRequest {
115 struct RequestHeader header;
116 char arguments[MAX_CMDLEN+1];
117};
118
119struct KillDaemonRequest {
120 struct RequestHeader header;
121};
122
123struct PPPDExitStatusRequest {
124 struct RequestHeader header;
125};
126
127struct StopRequest {
128 struct RequestHeader header;
129};
130
131union AllRequests {
132 struct RequestHeader header;
133 struct OpenModemRequest modem;
134 struct OpenLockRequest lock;
135 struct RemoveLockRequest unlock;
136 struct OpenResolvRequest resolv;
137 struct SetSecretRequest secret;
138 struct RemoveSecretRequest remove;
139 struct SetHostnameRequest host;
140 struct OpenLogRequest log;
141 struct ExecDaemonRequest daemon;
142 struct ExecDaemonRequest kill;
143 struct PPPDExitStatusRequest status;
144 struct StopRequest stop;
145};
146
147#endif
148