ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/proj/trunk/Spectre/Mounter.cpp
(Generate patch)

Comparing trunk/Spectre/Mounter.cpp (file contents):
Revision 171 by douglas, 2003-06-24T20:12:11-07:00 vs.
Revision 172 by douglas, 2003-06-28T21:08:05-07:00

# Line 4 | Line 4
4   //
5   // Mounter.cpp
6  
7 + #ifdef _FreeBSD_
8 + #include <fcntl.h>
9 + #endif
10 +
11   #include "Mounter.h"
12  
13   void Mounter::mount()
14   {
15          samba();
16  
17 +        if (debug)
18 +        {
19 +                cerr << "mounted = {\n";
20 +
21 +                for (set<string>::iterator itor = mounted.begin();
22 +                        itor != mounted.end(); itor++)
23 +                {
24 +                        cerr << "   " << *itor << "\n";
25 +                }
26 +
27 +                cerr << "}\n";
28 +        }
29 +
30          if (debug) cerr << "folders = {\n";
31  
32          for (map<string, Folder>::iterator itor = folders.begin(); itor !=
# Line 20 | Line 37 | void Mounter::mount()
37                          << "      remote = " << itor->second.remote << "\n"
38                          << "   }\n";
39  
40 <                mount(itor->first, itor->second.local);
40 >                mount(itor->first, itor->second.local, itor->second.remote);
41          }
42  
43          if (debug) cerr << "}\n";
# Line 58 | Line 75 | void Mounter::samba()
75          }
76  
77          closedir(dir);
78 +
79 +        vector<string> args;
80 +
81 +        args.push_back("spectre");
82 +        args.push_back("-t");
83 +        args.push_back("smbfs");
84 +
85 +        ipstream mount(config.mount, args);
86 +
87 +        if (debug) cerr << "mount = {\n";
88 +
89 +        samba(mount);
90 +
91 +        if (debug) cerr << "}\n";
92 +
93 +        mount.close();
94   }
95  
96   void Mounter::samba(ipstream& pin)
97   {
98 <        //
98 >        while (pin.good())
99 >        {
100 >                string line;
101 >
102 >                getline(pin, line);
103 >
104 >                if (debug) cerr << line << "\n";
105 >
106 >                if (line == "") continue;
107 >
108 >                unsigned begin = line.find(" on ") + 4;
109 > #if defined _Linux_
110 >                unsigned end = line.rfind(" type smbfs");
111 > #elif defined _FreeBSD_
112 >                unsigned end = line.rfind(" (smbfs)");
113 > #endif
114 >
115 >                string path = line.substr(begin, end - begin);
116 >
117 >                if (mounted.find(path) == mounted.end())
118 >                {
119 >                        mounted.insert(path);
120 >                }
121 >        }
122   }
123  
124 < void Mounter::mount(const string& folder, const string& user)
124 > void Mounter::mount(const string& folder, const string& user, const string&
125 >        owner)
126   {
127 <        //
127 >        string path = config.root + "/" + host + "/" + folder;
128 >        
129 >        if (mounted.find(path) != mounted.end()) return;
130 >
131 >        ostringstream options;
132 >
133 >        struct passwd* item = getpwnam(user.c_str());
134 >
135 >        if (item == NULL)
136 >        {
137 >                cerr << program << ": " << user << ": Unknown user\n";
138 >                return;
139 >        }
140 >        
141 > #if defined _Linux_
142 >        char credentials[17];
143 >
144 >        sprintf(credentials, "%s", "/tmp/spectre.XXXX");
145 >        mkstemp(credentials);
146 >        
147 >        ofstream fout(credentials);
148 >
149 >        fout << "username = " << owner << "\n"
150 >                << "password = " << password(owner) << "\n";
151 >
152 >        fout.close();
153 >
154 >        options << "credentials=" << credentials << ","
155 >                << "uid=" << item->pw_uid << ","
156 >                << "gid=" << item->pw_gid;
157 >        
158 >        string smb = "//" + host + "/" + folder;
159 > #elif defined _FreeBSD_
160 >        char* credentials = "~/.nsmbrc";
161 >
162 >        int dot = open(credentials, O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
163 >        close(dot);
164 >
165 >        ofstream fout(credentials);
166 >
167 >        fout << "[default]\n"
168 >                << "password=" << password(owner) << "\n";
169 >
170 >        fout.close();
171 >
172 >        options << "-N,"
173 >                << "-u=" << item->pw_uid << ","
174 >                << "-g=" << item->pw_gid;
175 >
176 >        string smb = "//" + owner + "@" + host + "/" + folder;
177 > #endif
178 >
179 >        vector<string> args;
180 >
181 >        args.push_back("spectre");
182 > #ifdef _FreeBSD_
183 >        args.push_back("-o");
184 >        args.push_back(options.str());
185 > #endif
186 >        args.push_back("-t");
187 >        args.push_back("smbfs");
188 > #ifdef _Linux_
189 >        args.push_back("-o");
190 >        args.push_back(options.str());
191 > #endif
192 >        args.push_back(smb);
193 >        args.push_back(path);
194 >
195 >        ipstream mount(config.mount, args, pstreambuf::pstderr);
196 >
197 >        while (mount.good())
198 >        {
199 >                string line;
200 >
201 >                getline(mount, line);
202 >
203 >                if (line != "") cerr << line << "\n";
204 >        }
205 >
206 >        mount.close();
207 >
208 >        unlink(credentials);
209   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines