ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/Spectre/trunk/Mounter.cpp
Revision: 228
Committed: 2003-07-30T21:14:12-07:00 (21 years, 11 months ago) by douglas
Original Path: trunk/Spectre/Mounter.cpp
File size: 4189 byte(s)
Log Message:
Made Unmounter and made autounmount work. I like cheese.

File Contents

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