mc/vfs/utilvfs.c

237 lines
5.5 KiB
C
Raw Normal View History

1998-02-27 07:54:42 +03:00
/* Utilities for VFS modules.
Copyright (C) 1988, 1992 Free Software Foundation
1998-02-27 07:54:42 +03:00
Copyright (C) 1995, 1996 Miguel de Icaza
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License
as published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
1998-02-27 07:54:42 +03:00
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Library General Public License for more details.
1998-02-27 07:54:42 +03:00
You should have received a copy of the GNU Library General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
1998-02-27 07:54:42 +03:00
#include <config.h>
#include <ctype.h>
#include "utilvfs.h"
#include "vfs.h"
1998-02-27 07:54:42 +03:00
/* Extract the hostname and username from the path */
/* path is in the form: [user@]hostname:port/remote-dir, e.g.:
*
* ftp://sunsite.unc.edu/pub/linux
* ftp://miguel@sphinx.nuclecu.unam.mx/c/nc
* ftp://tsx-11.mit.edu:8192/
* ftp://joe@foo.edu:11321/private
* ftp://joe:password@foo.se
*
2002-12-15 22:38:18 +03:00
* Returns g_malloc()ed host, user and pass they are present.
* If the user is empty, e.g. ftp://@roxanne/private, and URL_ALLOW_ANON
* is not set, then the current login name is supplied.
1998-02-27 07:54:42 +03:00
*
2002-12-15 22:38:18 +03:00
* Return value is a g_malloc()ed string with the pathname relative to the
* host.
*/
1998-02-27 07:54:42 +03:00
#ifdef USE_NETCODE
char *
vfs_split_url (const char *path, char **host, char **user, int *port,
char **pass, int default_port, int flags)
1998-02-27 07:54:42 +03:00
{
struct passwd *passwd_info;
char *dir, *colon, *inner_colon, *at, *rest;
char *retval;
char *pcopy = g_strdup (path);
char *pend = pcopy + strlen (pcopy);
if (pass)
*pass = NULL;
1998-02-27 07:54:42 +03:00
*port = default_port;
*user = NULL;
retval = NULL;
dir = pcopy;
if (!(flags & URL_NOSLASH)) {
/* locate path component */
while (*dir != PATH_SEP && *dir)
dir++;
if (*dir) {
retval = g_strdup (dir);
*dir = 0;
} else
retval = g_strdup (PATH_SEP_STR);
}
1998-02-27 07:54:42 +03:00
/* search for any possible user */
at = strchr (pcopy, '@');
1998-02-27 07:54:42 +03:00
/* We have a username */
if (at) {
1998-02-27 07:54:42 +03:00
*at = 0;
inner_colon = strchr (pcopy, ':');
if (inner_colon) {
1998-02-27 07:54:42 +03:00
*inner_colon = 0;
inner_colon++;
if (pass)
*pass = g_strdup (inner_colon);
1998-02-27 07:54:42 +03:00
}
These are a bunch of changes to fix CORBA and session management. They are almost complete (i.e. to handle all nitty gritty cases), but they seem to be working OK right now. SM should be much more stable now. Please tell me if you find any weird behavior - Federico 1999-03-30 Federico Mena Quintero <federico@nuclecu.unam.mx> * gdesktop-icon.c (desktop_icon_realize): Remove the WM_CLIENT_LEADER property from icon windows so that window managers will not store SM information for them. * gnome-open-dialog.c: Added missing #includes. * gdesktop-init.c (desktop_init_at): Removed an unused variable. * gdesktop.h: Added some missing prototypes. * gmain.h: Added some missing prototypes. * Makefile.in: Added gsession.[ch] to the list of sources. * gmain.c (create_panels): Consider whether we have a CORBA server and session management. * gdesktop.c: #include "gdesktop-init.h" * gdesktop.c: Added a missing cast to GNOME_DIALOG. * gmain.c (create_panels): Removed the run_desktop global variable. * glayout.c (create_container): Set the wmclass of the panel to include its unique ID. * gsession.[ch]: New file with the functions that deal with session management. * glayout.c (gnome_exit): Use session_set_restart(). * gcorba.c (corba_init): Now returns an int with an error value. (corba_init_server): Initialize the server properly. Fixed all the object implementation code. (corba_create_window): New function used to create a window with the CORBA server. * gmain.c (gnome_check_super_user): Now the check for running as root is done here. There should be no GUI code in src/. 1999-03-30 Federico Mena Quintero <federico@nuclecu.unam.mx> * dlg.c (dlg_run_done): Do not call the callback of a NULL current widget. * setup.h: Added missing prototype for setup_init(). * filegui.c (check_progress_buttons): Added a missing return value. * dlg.c (remove_widget): Added a missing return value. * main.c: Removed the global directory_list variable. Removed the main_corba_register_server() function. * main.h: Removed the global run_desktop variable. * panel.h: Now the panel structure has a unique numerical ID used for session management. * screen.c (panel_new): Maintain a unique ID for each panel. * main.c (maybe_display_linksdir): Handle display of the desktop init dir here. (main): Call gnome_check_super_user(). (init_corba_with_args): Call corba_init_server(). * main.c (init_corba_with_args): Do CORBA initialization here. Also removed the global force_activation option. 1999-03-30 Federico Mena Quintero <federico@nuclecu.unam.mx> * vfs.c (vfs_add_current_stamps): Only do stamping of the panels if they exist. * mcserv.c: #include <sys/wait.h> (get_client): Put `#ifdef __EMX__' around an otherwise-unused variable. * utilvfs.c (vfs_split_url): Fix NULL <-> 0 confusion when comparing characters. * ftpfs.c (retrieve_dir): Removed unused variable dot_dot_found. * extfs.c (extfs_init): Assign `key' to c, not `&key'.
1999-03-30 10:09:56 +04:00
if (*pcopy != 0)
*user = g_strdup (pcopy);
if (pend == at + 1)
1998-02-27 07:54:42 +03:00
rest = at;
else
rest = at + 1;
} else
rest = pcopy;
if (!*user && !(flags & URL_ALLOW_ANON)) {
passwd_info = getpwuid (geteuid ());
if (passwd_info && passwd_info->pw_name)
*user = g_strdup (passwd_info->pw_name);
1998-02-27 07:54:42 +03:00
else {
/* This is very unlikely to happen */
*user = g_strdup ("anonymous");
1998-02-27 07:54:42 +03:00
}
endpwent ();
1998-02-27 07:54:42 +03:00
}
1998-02-27 07:54:42 +03:00
/* Check if the host comes with a port spec, if so, chop it */
colon = strchr (rest, ':');
if (colon) {
1998-02-27 07:54:42 +03:00
*colon = 0;
if (sscanf (colon + 1, "%d", port) == 1) {
if (*port <= 0 || *port >= 65536)
*port = default_port;
} else {
while (*(++colon)) {
switch (*colon) {
case 'C':
*port = 1;
break;
case 'r':
*port = 2;
break;
}
}
}
1998-02-27 07:54:42 +03:00
}
if (host)
*host = g_strdup (rest);
1998-02-27 07:54:42 +03:00
g_free (pcopy);
1998-02-27 07:54:42 +03:00
return retval;
}
#endif /* USE_NETCODE */
/*
* Look up a user or group name from a uid/gid, maintaining a cache.
* FIXME, for now it's a one-entry cache.
* FIXME2, the "-993" is to reduce the chance of a hit on the first lookup.
* This file should be modified for non-unix systems to do something
* reasonable.
*/
#ifndef TUNMLEN
#define TUNMLEN 256
#endif
#ifndef TGNMLEN
#define TGNMLEN 256
#endif
#define myuid ( my_uid < 0? (my_uid = getuid()): my_uid )
#define mygid ( my_gid < 0? (my_gid = getgid()): my_gid )
int
vfs_finduid (char *uname)
{
static int saveuid = -993;
static char saveuname[TUNMLEN];
static int my_uid = -993;
struct passwd *pw;
if (uname[0] != saveuname[0] /* Quick test w/o proc call */
||0 != strncmp (uname, saveuname, TUNMLEN)) {
strncpy (saveuname, uname, TUNMLEN);
pw = getpwnam (uname);
if (pw) {
saveuid = pw->pw_uid;
} else {
saveuid = myuid;
}
}
return saveuid;
}
int
vfs_findgid (char *gname)
{
static int savegid = -993;
static char savegname[TGNMLEN];
static int my_gid = -993;
struct group *gr;
if (gname[0] != savegname[0] /* Quick test w/o proc call */
||0 != strncmp (gname, savegname, TUNMLEN)) {
strncpy (savegname, gname, TUNMLEN);
gr = getgrnam (gname);
if (gr) {
savegid = gr->gr_gid;
} else {
savegid = mygid;
}
}
return savegid;
}
/*
* Create a temporary file with a name resembling the original.
* This is needed e.g. for local copies requested by extfs.
* Some extfs scripts may look at the extension.
* We also protect stupid scripts agains dangerous names.
*/
int
vfs_mkstemps (char **pname, const char *prefix, const char *basename)
{
const unsigned char *p;
char *suffix, *q;
int shift;
int fd;
/* Strip directories */
p = strrchr (basename, PATH_SEP);
if (!p)
p = basename;
else
p++;
/* Protection against very long names */
shift = strlen (p) - (MC_MAXPATHLEN - 16);
if (shift > 0)
p += shift;
suffix = g_malloc (MC_MAXPATHLEN);
/* Protection against unusual characters */
q = suffix;
while (*p && (*p != '#')) {
if (strchr (".-_@", *p) || isalnum (*p))
*q++ = *p;
p++;
}
*q = 0;
fd = mc_mkstemps (pname, prefix, suffix);
g_free (suffix);
return fd;
}