ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/Spectre/Mounter.cpp
Revision: 174
Committed: 2003-06-29T01:53:27-07:00 (21 years, 11 months ago) by douglas
File size: 4219 byte(s)
Log Message:
Got FreeBSD mounting working! (Ack, what's up with everything having to be
uppercase? Horrible!)

File Contents

# Content
1 // Spectre Samba Mounter
2 //
3 // Douglas Thrift
4 //
5 // Mounter.cpp
6
7 #include "Mounter.h"
8
9 #ifdef _FreeBSD_
10 #include <cctype>
11 #include <fcntl.h>
12
13 inline string toupper(const string& lower)
14 {
15 string upper;
16
17 for (unsigned index = 0; index < lower.length(); index++)
18 {
19 upper += toupper(lower[index]);
20 }
21
22 return upper;
23 }
24 #endif
25
26 void Mounter::mount()
27 {
28 samba();
29
30 if (debug)
31 {
32 cerr << "mounted = {\n";
33
34 for (set<string>::iterator itor = mounted.begin();
35 itor != mounted.end(); itor++)
36 {
37 cerr << " " << *itor << "\n";
38 }
39
40 cerr << "}\n";
41 }
42
43 if (debug) cerr << "folders = {\n";
44
45 for (map<string, Folder>::iterator itor = folders.begin(); itor !=
46 folders.end(); itor++)
47 {
48 if (debug) cerr << " " << itor->first << " = {\n"
49 << " local = " << itor->second.local << "\n"
50 << " remote = " << itor->second.remote << "\n"
51 << " }\n";
52
53 mount(itor->first, itor->second.local, itor->second.remote);
54 }
55
56 if (debug) cerr << "}\n";
57 }
58
59 void Mounter::samba()
60 {
61 string path = config.root + "/" + host;
62
63 DIR* dir = opendir(path.c_str());
64
65 dirent* file;
66
67 while ((file = readdir(dir)) != NULL)
68 {
69 struct stat dir;
70 string folder = path + "/" + file->d_name;
71
72 stat(folder.c_str(), &dir);
73
74 if (S_ISDIR(dir.st_mode))
75 {
76 string folder = file->d_name;
77
78 if (folder == "." || folder == "..") continue;
79
80 string share = folder.find('.') == 0 ? folder.erase(0, 1) + "$" :
81 folder;
82
83 if (folders.find(share) == folders.end())
84 {
85 folders.insert(pair<string, Folder>(share, regular));
86 }
87 }
88 }
89
90 closedir(dir);
91
92 vector<string> args;
93
94 args.push_back("spectre");
95 args.push_back("-t");
96 args.push_back("smbfs");
97
98 ipstream mount(config.mount, args);
99
100 if (debug) cerr << "mount = {\n";
101
102 samba(mount);
103
104 if (debug) cerr << "}\n";
105
106 mount.close();
107 }
108
109 void Mounter::samba(ipstream& pin)
110 {
111 while (pin.good())
112 {
113 string line;
114
115 getline(pin, line);
116
117 if (debug) cerr << line << "\n";
118
119 if (line == "") continue;
120
121 unsigned begin = line.find(" on ") + 4;
122 #if defined _Linux_
123 unsigned end = line.rfind(" type smbfs");
124 #elif defined _FreeBSD_
125 unsigned end = line.rfind(" (smbfs)");
126 #endif
127
128 string path = line.substr(begin, end - begin);
129
130 if (mounted.find(path) == mounted.end())
131 {
132 mounted.insert(path);
133 }
134 }
135 }
136
137 void Mounter::mount(const string& folder, const string& user, const string&
138 owner)
139 {
140 string path = config.root + "/" + host + "/" + (folder[folder.length() -
141 1] == '$' ? "." + folder.substr(0, folder.length() - 1) : folder);
142
143 if (mounted.find(path) != mounted.end()) return;
144
145 ostringstream options;
146
147 struct passwd* item = getpwnam(user.c_str());
148
149 if (item == NULL)
150 {
151 cerr << program << ": " << user << ": Unknown user\n";
152 return;
153 }
154
155 #if defined _Linux_
156 char credentials[17];
157
158 sprintf(credentials, "%s", "/tmp/spectre.XXXX");
159 mkstemp(credentials);
160
161 ofstream fout(credentials);
162
163 fout << "username = " << owner << "\n"
164 << "password = " << password(owner) << "\n";
165
166 fout.close();
167
168 options << "credentials=" << credentials << ","
169 << "uid=" << item->pw_uid << ","
170 << "gid=" << item->pw_gid;
171
172 string smb = "//" + host + "/" + folder;
173 #elif defined _FreeBSD_
174 char* credentials = new char[strlen(getenv("HOME")) + 9];
175
176 sprintf(credentials, "%s/.nsmbrc", getenv("HOME"));
177 int dot = open(credentials, O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
178 close(dot);
179
180 ofstream fout(credentials);
181
182 fout << "[" << toupper(host) << ":" << toupper(owner) << "]\n"
183 << "password=" << password(owner) << "\n";
184
185 fout.close();
186
187 options << "-N,"
188 << "-u=" << item->pw_uid << ","
189 << "-g=" << item->pw_gid;
190
191 string smb = "//" + owner + "@" + host + "/" + folder;
192 #endif
193
194 vector<string> args;
195
196 args.push_back("spectre");
197 #ifdef _FreeBSD_
198 args.push_back("-o");
199 args.push_back(options.str());
200 #endif
201 args.push_back("-t");
202 args.push_back("smbfs");
203 #ifdef _Linux_
204 args.push_back("-o");
205 args.push_back(options.str());
206 #endif
207 args.push_back(smb);
208 args.push_back(path);
209
210 ipstream mount(config.mount, args, pstreambuf::pstderr);
211
212 while (mount.good())
213 {
214 string line;
215
216 getline(mount, line);
217
218 if (line != "") cerr << line << "\n";
219 }
220
221 mount.close();
222
223 unlink(credentials);
224 #ifdef _FreeBSD_
225 delete [] credentials;
226 #endif
227 }