ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Spectre2/Mounter.cpp
Revision: 439
Committed: 2005-04-07T15:56:53-07:00 (20 years, 2 months ago) by douglas
File size: 2693 byte(s)
Log Message:
Did stuff. Yay!

File Contents

# User Rev Content
1 douglas 402 // Spectre 2
2     //
3     // Douglas Thrift
4     //
5     // $Id$
6    
7     #include "Mounter.hpp"
8    
9 douglas 432 #include <grp.h>
10     #include <pwd.h>
11    
12 douglas 431 void Mounter::operator()()
13 douglas 408 {
14 douglas 432 // XXX: make sure the directory exists!
15    
16     #ifdef __FreeBSD__
17     {
18     bool password(false);
19    
20 douglas 433 // XXX: _unsynchronized
21     _synchronized (Daemon::secretLock)
22 douglas 432 {
23     api::FileReader in(Daemon::secret);
24     ext::String line;
25    
26     while (ios::ReadLine(in, line)) if (line == "[" + share.getHost() + ":" + share.getOwner() + "]")
27     {
28     password = true;
29    
30     break;
31     }
32     }
33    
34 douglas 433 if (!password) _synchronized (Daemon::secretLock)
35 douglas 432 {
36 douglas 439 api::FileWriter out(Daemon::secret, O_WRONLY | O_APPEND, 0);
37 douglas 432 ios::FormatWriter fout(out);
38    
39     fout << "[" << share.getHost() << ":" << share.getOwner() << "]" << ios::NewLine << "password=" << share.getPassword() << ios::NewLine;
40     }
41     }
42     #else
43     _S<ios::String> credentials;
44    
45     // XXX: _unsynchronized
46     _synchronized (Daemon::secretsLock) if (Daemon::secrets.Contains(share.getOwner() + "@" + share.getHost()))
47     credentials = Daemon::secrets[share.getOwner() + "@" + share.getHost()];
48    
49     if (credentials.IsEmpty())
50     {
51     credentials << "/tmp/.spectre" << api::Uuid::Create();
52    
53     {
54 douglas 439 api::FileWriter out(credentials, O_WRONLY | O_CREAT | O_TRUNC, 0600);
55 douglas 432 ios::FormatWriter fout(out);
56    
57     fout << "username = " << share.getOwner() << ios::NewLine << "password = " << share.getPassword() << ios::NewLine;
58     }
59    
60     _synchronized (Daemon::secretsLock)
61     Daemon::secrets[share.getOwner() + "@" + share.getHost()];
62     }
63     #endif
64    
65     _S<ios::String> uid;
66    
67     {
68     ::passwd pwd, * result;
69     ext::Buffer buffer(1024);
70    
71     api::Posix::CheckError(::getpwnam_r(share.getUser().NullTerminate(), &pwd, buffer.Begin(), buffer.GetSize(), &result));
72    
73     uid << pwd.pw_uid;
74     }
75    
76     _S<ios::String> gid;
77    
78     {
79     ::group grp, * result;
80     ext::Buffer buffer(1024);
81    
82     api::Posix::CheckError(::getgrnam_r(share.getGroup().NullTerminate(), &grp, buffer.Begin(), buffer.GetSize(), &result));
83    
84     gid << grp.gr_gid;
85     }
86    
87     _L<ext::String> options;
88    
89     #ifdef __FreeBSD__
90     options.InsertLast("-N");
91     // XXX: hmm?
92     // options.InsertLast("-O=" + share.getOwner() + ":");
93     options.InsertLast("-u=" + uid);
94     options.InsertLast("-g=" + gid);
95     #else
96     options.InsertLast("credentials=" + credentials);
97     options.InsertLast("uid=" + uid);
98     options.InsertLast("gid=" + gid);
99     options.InsertLast("rw");
100     #endif
101    
102     _L<ext::String> args(1, "-o");
103    
104     args.InsertLast(ext::JoinAll<ext::String>(options, ","));
105     args.InsertLast("-t");
106     args.InsertLast("smbfs");
107     args.InsertLast(share.getService());
108     args.InsertLast(share.getMount());
109    
110     _S<api::Process> mount(Spectre2::mount, args);
111    
112     if (Spectre2::debug)
113     ios::ReadToWrite(*mount.GetReader(), api::Cout);
114     else
115     ios::Discard(*mount.GetReader());
116 douglas 402 }

Properties

Name Value
svn:eol-style native
svn:keywords Id