ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Syncify/Syncify.cpp
(Generate patch)

Comparing Syncify/Syncify.cpp (file contents):
Revision 435 by douglas, 2005-04-03T15:42:59-07:00 vs.
Revision 440 by douglas, 2005-04-07T22:53:00-07:00

# Line 5 | Line 5
5   // $Id$
6  
7   #include "Syncify.hpp"
8 + #include "SambaReader.hpp"
9  
10   #include <menes-api/exename.hpp>
11   #include <menes-app/simple.hpp>
12  
13 + #include <stdio.h>
14 +
15   int Main(const app::Options& options)
16   {
17 <        //
17 >        ext::String local("."), remote, pattern("^.*$");
18          
19          _foreach (const app::ArgumentList, arg, app::GetArguments())
20          {
21 <                if (*arg == "-D")
21 >                Matcher matcher;
22 >
23 >                if (*arg == matcher("^-local=(.+)$"))
24 >                        local = matcher[1];
25 >                else if (*arg == matcher("^-remote=(.+)$"))
26 >                        remote = matcher[1];
27 >                else if (*arg == matcher("^-pattern=(.+)$"))
28 >                        pattern = matcher[1];
29 >                else if (*arg == "-D")
30                          Syncify::debug = true;
31                  else
32                  {
33 <                        api::Cerr << "Usage: " << Syncify::program << " [-D]" << ios::NewLine;
33 >                        api::Cerr << "Usage: " << Syncify::program << " [-local=local] -remote=remote [-pattern=pattern] [-D]" << ios::NewLine;
34  
35                          return 1;
36                  }
37          }
38  
39 <        //
39 >        if (remote.IsEmpty())
40 >        {
41 >                api::Cerr << "Usage: " << Syncify::program << " [-local=local] -remote=remote [-pattern=pattern] [-D]" << ios::NewLine;
42 >
43 >                return 1;
44 >        }
45 >
46 >        Syncify syncify(local, remote, pattern);
47          
48          return 0;
49   }
50  
51   extern "C"
52   {
53 <        void authenticate(const char* srv, const char* shr, char* wg, int wglen, char* un, int unlen, char* pw, int pwlen) {}
53 >        void authenticate(const char* srv, const char* shr, char* wg, int wglen, char* un, int unlen, char* pw, int pwlen)
54 >        {
55 >                static ext::Buffer user("Douglas Thrift"), password(::getpass("Password:"));
56 >
57 >                _foreach (ext::Buffer, atom, user)
58 >                        un[_index] = *atom;
59 >                _foreach (ext::Buffer, atom, password)
60 >                        pw[_index] = *atom;
61 >
62 >                un[user.GetSize() < size_t(unlen) ? user.GetSize() : unlen - 1] = '\0';
63 >                pw[password.GetSize() < size_t(pwlen) ? password.GetSize() : pwlen - 1] = '\0';
64 >        }
65 > }
66 >
67 > Syncify::Syncify(const ext::String& local, const ext::String& remote, const ext::String& pattern) : pattern(pattern)
68 > {
69 >        CheckError(::smbc_init(authenticate, debug ? 2 : 0));
70 >
71 >        syncify(local, remote);
72 > }
73 >
74 > Syncify::~Syncify()
75 > {
76 >        ::smbc_free_context(::smbc_set_context(NULL), 1);
77   }
78  
79   ext::String Syncify::program(api::GetExecutablePath().GetName());
80   bool Syncify::debug(false);
81 +
82 + void Syncify::syncify(const api::Path& local, const ext::String& remote)
83 + {
84 +        try
85 +        {
86 +                Matcher dots("^\\.{1,2}$");
87 +                ext::RedBlackSet<ext::String> directories;
88 +                int directory(CheckError(::smbc_opendir(remote.NullTerminate())));
89 +
90 +                for (::smbc_dirent* entity(::smbc_readdir(directory)); entity != NULL; entity = ::smbc_readdir(directory)) switch (entity->smbc_type)
91 +                {
92 +                case SMBC_FILE:
93 +                        if (entity->name == pattern)
94 +                        {
95 +                                api::Path path(local.GetChild(entity->name));
96 +
97 +                                if (!path.Exists())
98 +                                {
99 +                                        SambaReader samba(remote + "/" + entity->name);
100 +                                        api::FileWriter file(path.GetPath());
101 +
102 +                                        ios::ReadToWrite(samba, file);
103 +                                }
104 +                        }
105 +                        break;
106 +                case SMBC_DIR:
107 +                case SMBC_LINK:
108 +                        if (entity->name != dots)
109 +                                directories.Insert(entity->name);
110 +                }
111 +
112 +                ::smbc_closedir(directory);
113 +
114 +                _foreach (const ext::RedBlackSet<ext::String>, directory, directories)
115 +                        syncify(local.GetChild(*directory), remote + "/" + *directory);
116 +        }
117 +        catch (const Error& error)
118 +        {
119 +                api::Cerr << error.GetMessage() << remote << ios::NewLine;
120 +        }
121 + }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines