diff options
Diffstat (limited to 'ACE/apps/drwho/File_Manager.cpp')
-rw-r--r-- | ACE/apps/drwho/File_Manager.cpp | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/ACE/apps/drwho/File_Manager.cpp b/ACE/apps/drwho/File_Manager.cpp new file mode 100644 index 00000000000..74aa7fbb7a0 --- /dev/null +++ b/ACE/apps/drwho/File_Manager.cpp @@ -0,0 +1,171 @@ +// $Id$ + +#include "ace/OS_NS_stdio.h" +#include "ace/OS_NS_pwd.h" +#include "ace/OS_NS_string.h" +#include "ace/os_include/os_ctype.h" +#include "File_Manager.h" + +File_Manager::File_Manager (void) + : number_of_friends (0), + max_key_length (0), + buffer_ptr (0), + current_ptr (0), + buffer_size (0) +{ +} + +// Either opens the friends file (if FILENAME is not a NULL pointer) +// or opens up the password file. In either case, the number of +// entries in the file are returned, i.e., number of friends... + +int +File_Manager::open_file (const char *filename) +{ + return filename == 0 + ? this->open_passwd_file () + : this->open_friends_file (filename); +} + +// Returns the next LOGIN_NAME and REAL_NAME from the file. + +void +File_Manager::get_login_and_real_name (const char *&login_name, const char *&real_name) +{ + char *buf_ptr = this->current_ptr; + + login_name = buf_ptr; + + // Skip to the end of the login name. + + while (isalnum (*buf_ptr)) + buf_ptr++; + + *buf_ptr++ = '\0'; + + // Now skip over white space to *start* of real name! + + while (isspace (*buf_ptr) || *buf_ptr == '\0') + buf_ptr++; + + real_name = buf_ptr; + + while (*buf_ptr++ != '\n') + continue; + + // Clear the trailing blanks and junk. + + for (char *tmp_ptr = buf_ptr - 1; + isspace (*tmp_ptr); + tmp_ptr--) + *tmp_ptr = '\0'; + + // Skip over consecutive blank lines. + + while (*buf_ptr == '\n') + buf_ptr++; + + this->current_ptr = buf_ptr; +} + +// Open up the yp passwd file and slurp all the users in! + +int +File_Manager::open_passwd_file (void) +{ + const char *filename = ACE_OS::tempnam (); + FILE *fp = ACE_OS::fopen (filename, "w"); + + if (fp == 0) + return -1; + + passwd *pwent; + + for (ACE_OS::setpwent (); + (pwent = ACE_OS::getpwent ()) != 0; ) + if (*pwent->pw_gecos != '\0') + { + char *cp = ACE_OS::strchr (pwent->pw_gecos, ','); + + if (cp != 0) + *cp = '\0'; + + ACE_OS::fprintf (fp, + "%-8.8s %s\n", + pwent->pw_name, + pwent->pw_gecos); + this->number_of_friends++; + } + + ACE_OS::endpwent (); + + ACE_OS::fclose (fp); + + if (this->mmap_.map (filename) == -1) + return -1; + + this->buffer_ptr = (char *) this->mmap_.addr (); + + this->buffer_size = this->mmap_.size (); + this->current_ptr = this->buffer_ptr; + return this->number_of_friends; +} + +// This function opens up FILENAME and memory maps it in our address +// space. + +int +File_Manager::open_friends_file (const char *filename) +{ + char directory[MAXPATHLEN]; + const char *pathname = directory; + + // See if we've got a filename or a pathname (i.e., directory/filename). + + if (ACE_OS::strrchr (filename, '/') != 0) + // We've got a complete pathname. + pathname = filename; + else + { + directory[0] = '\0'; + + const char *home = ACE_OS::getenv ("HOME"); + if (home != 0) + { + ACE_OS::strcat (directory, home); + ACE_OS::strcat (directory, "/"); + } + ACE_OS::strcat (directory, filename); + } + + // Do the mmap'ing. + + if (this->mmap_.map (pathname) == -1) + return -1; + + this->buffer_ptr = (char *) this->mmap_.addr (); + + this->buffer_size = this->mmap_.size (); + this->current_ptr = this->buffer_ptr; + + // Determine how many friends there are by counting the newlines. + + for (char *cp = this->buffer_ptr + this->buffer_size; + cp > this->buffer_ptr + ;) + if (*--cp == '\n') + { + this->number_of_friends++; + + // Skip consecutive newlines. + while (cp[-1] == '\n') + --cp; + } + + return this->number_of_friends; +} + +#if defined (ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION) +template ACE_Singleton<File_Manager, ACE_Null_Mutex> * + ACE_Singleton<File_Manager, ACE_Null_Mutex>::singleton_; +#endif /* ACE_HAS_EXPLICIT_STATIC_TEMPLATE_MEMBER_INSTANTIATION */ |