|
Lines 499-505
main (int argc, char **argv)
|
Link Here
|
|---|
|
_("The \"hald\" service is required but not currently " | _("The \"hald\" service is required but not currently " |
"running. Enable the service and rerun this application, " | "running. Enable the service and rerun this application, " |
"or contact your system administrator.\n\n" | "or contact your system administrator.\n\n" |
|
#ifndef __FreeBSD__ |
"Note: You need Linux kernel 2.6 for volume " | "Note: You need Linux kernel 2.6 for volume " |
|
#else |
|
"Note: You need sysutils/hal installed for volume " |
|
#endif |
"management to work.")); | "management to work.")); |
| |
gtk_dialog_run (GTK_DIALOG (dialog)); | gtk_dialog_run (GTK_DIALOG (dialog)); |
|
|
#include <sys/types.h> | #include <sys/types.h> |
#include <sys/stat.h> | #include <sys/stat.h> |
#include <dirent.h> | #include <dirent.h> |
|
#include <fcntl.h> |
#include <signal.h> | #include <signal.h> |
#include <unistd.h> | #include <unistd.h> |
#include <utmp.h> | #include <utmp.h> |
|
#include <sys/param.h> |
|
#include <sys/mount.h> |
| |
#include <locale.h> | #include <locale.h> |
| |
|
|
MOUNT_UID = (1 << 15), | MOUNT_UID = (1 << 15), |
MOUNT_UMASK = (1 << 16), | MOUNT_UMASK = (1 << 16), |
MOUNT_UTF8 = (1 << 17), | MOUNT_UTF8 = (1 << 17), |
|
MOUNT_LOCALE = (1 << 18), |
|
MOUNT_LONGNAME = (1 << 19), |
}; | }; |
| |
static struct { | static struct { |
const char *name; | const char *name; |
guint32 flag; | guint32 flag; |
} mount_options[] = { | } mount_options[] = { |
|
#ifdef __FreeBSD__ |
|
{ "-D=", MOUNT_CODEPAGE }, /* vfat */ |
|
{ "-M=", MOUNT_DMASK }, /* vfat */ |
|
{ "-m=", MOUNT_FMASK }, /* vfat, ntfs */ |
|
{ "-L=", MOUNT_LOCALE }, /* vfat */ |
|
{ "-C=", MOUNT_IOCHARSET }, /* ntfs, ios9660 */ |
|
{ "noatime", MOUNT_NOATIME }, |
|
{ "noexec", MOUNT_NOEXEC }, |
|
{ "ro", MOUNT_READ_ONLY }, |
|
{ "longnames", MOUNT_LONGNAME }, /* vfat */ |
|
{ "sync", MOUNT_SYNC }, |
|
{ "-u=", MOUNT_UID }, /* vfat, ntfs */ |
|
#else |
{ "codepage=", MOUNT_CODEPAGE }, /* vfat */ | { "codepage=", MOUNT_CODEPAGE }, /* vfat */ |
{ "data=", MOUNT_DATA }, /* ext3 */ | { "data=", MOUNT_DATA }, /* ext3 */ |
{ "dirsync", MOUNT_DIRSYNC }, | { "dirsync", MOUNT_DIRSYNC }, |
|
|
{ "uid=", MOUNT_UID }, /* vfat, ntfs, udf, iso9660 */ | { "uid=", MOUNT_UID }, /* vfat, ntfs, udf, iso9660 */ |
{ "umask=", MOUNT_UMASK }, /* vfat, ntfs, udf */ | { "umask=", MOUNT_UMASK }, /* vfat, ntfs, udf */ |
{ "utf8", MOUNT_UTF8 }, /* vfat, iso9660 */ | { "utf8", MOUNT_UTF8 }, /* vfat, iso9660 */ |
|
#endif |
}; | }; |
| |
| |
|
Lines 1760-1769
gvm_mount_options (GPtrArray *options, g
|
Link Here
|
|---|
|
g_slist_free_1 (l); | g_slist_free_1 (l); |
} | } |
| |
|
#ifndef __FreeBSD__ |
if (opts & MOUNT_UID) { | if (opts & MOUNT_UID) { |
option = g_strdup_printf ("uid=%u", getuid ()); | option = g_strdup_printf ("uid=%u", getuid ()); |
g_ptr_array_add (options, option); | g_ptr_array_add (options, option); |
} | } |
|
#else |
|
if (opts & MOUNT_UID && (!strcmp (where, "vfat") || !strcmp (where, "ntfs"))) { |
|
option = g_strdup_printf ("u=%u", getuid ()); |
|
g_ptr_array_add (options, option); |
|
} |
|
#endif |
| |
return TRUE; | return TRUE; |
} | } |
|
Lines 1813-1819
gvm_device_mount (const char *udi, gbool
|
Link Here
|
|---|
|
| |
return retval; | return retval; |
} else { | } else { |
char *mount_point, *fstype, *drive, **moptions, fmask_opt[12], *charset_opt = NULL; |
char *mount_point, *fstype, *drive, **moptions, fmask_opt[12], *charset_opt = NULL, *locale_opt = NULL; |
DBusMessage *dmesg, *reply; | DBusMessage *dmesg, *reply; |
gboolean freev = FALSE; | gboolean freev = FALSE; |
GPtrArray *options; | GPtrArray *options; |
|
Lines 1893-1913
gvm_device_mount (const char *udi, gbool
|
Link Here
|
|---|
|
| |
if (opts & MOUNT_FMASK) { | if (opts & MOUNT_FMASK) { |
mask = umask (0); | mask = umask (0); |
|
#ifdef __FreeBSD__ |
|
snprintf (fmask_opt, sizeof (fmask_opt), "-m=%#o", mask | 0111); |
|
#else |
snprintf (fmask_opt, sizeof (fmask_opt), "fmask=%#o", mask | 0111); | snprintf (fmask_opt, sizeof (fmask_opt), "fmask=%#o", mask | 0111); |
|
#endif |
g_ptr_array_add (options, fmask_opt); | g_ptr_array_add (options, fmask_opt); |
umask (mask); | umask (mask); |
} | } |
| |
if (opts & MOUNT_SHORTNAME) | if (opts & MOUNT_SHORTNAME) |
g_ptr_array_add (options, "shortname=lower"); | g_ptr_array_add (options, "shortname=lower"); |
|
if (opts & MOUNT_LONGNAME) |
|
g_ptr_array_add (options, "longnames"); |
|
|
|
if (opts & MOUNT_LOCALE) { |
|
char *locale; |
|
|
|
locale = setlocale(LC_ALL, NULL); |
|
if (!locale) |
|
locale = getenv("LANG"); |
|
if (locale) { |
|
|
|
locale_opt = g_strdup_printf ("-L=%s", locale); |
|
g_ptr_array_add (options, locale_opt); |
|
} |
|
} |
|
|
|
#ifdef __FreeBSD__ |
|
if (opts & MOUNT_CODEPAGE) { |
|
if ((iocharset = gvm_iocharset ())) { |
|
charset_opt = g_strdup_printf ("-D=%s", iocharset); |
|
g_ptr_array_add (options, charset_opt); |
|
} |
|
} |
|
|
|
if (opts & MOUNT_UID) { |
|
snprintf (uid, sizeof (uid) - 1, "-u=%s", getuid ()); |
|
g_ptr_array_add (options, uid); |
|
} |
|
#endif |
} else if (!strcmp (fstype, "iso9660")) { | } else if (!strcmp (fstype, "iso9660")) { |
/* only care about uid= and iocharset= */ | /* only care about uid= and iocharset= */ |
|
#ifdef __FreeBSD__ |
|
if (opts & MOUNT_IOCHARSET) { |
|
if ((iocharset = gvm_iocharset ())) { |
|
charset_opt = g_strdup_printf ("-C=%s", iocharset); |
|
g_ptr_array_add (options, charset_opt); |
|
} |
|
} |
|
#endif |
} else if (!strcmp (fstype, "udf")) { | } else if (!strcmp (fstype, "udf")) { |
/* also care about uid= and iocharset= */ | /* also care about uid= and iocharset= */ |
if (opts & MOUNT_NOATIME) | if (opts & MOUNT_NOATIME) |
g_ptr_array_add (options, "noatime"); | g_ptr_array_add (options, "noatime"); |
|
#ifdef __FreeBSD__ |
|
if (opts & MOUNT_IOCHARSET) { |
|
if ((iocharset = gvm_iocharset ())) { |
|
charset_opt = g_strdup_printf ("-C=%s", iocharset); |
|
g_ptr_array_add (options, charset_opt); |
|
} |
|
} |
|
#endif |
|
} else if (!strcmp (fstype, "ntfs")) { |
|
/* only care about uid= and iocharset= */ |
|
#ifdef __FreeBSD__ |
|
if (opts & MOUNT_IOCHARSET) { |
|
if ((iocharset = gvm_iocharset ())) { |
|
charset_opt = g_strdup_printf ("-C=%s", iocharset); |
|
g_ptr_array_add (options, charset_opt); |
|
} |
|
} |
|
|
|
if (opts & MOUNT_UID) { |
|
snprintf (uid, sizeof (uid) - 1, "-u=%s", getuid ()); |
|
g_ptr_array_add (options, uid); |
|
} |
|
#endif |
} | } |
| |
|
#ifndef __FreeBSD__ |
if (opts & (MOUNT_IOCHARSET|MOUNT_UTF8)) { | if (opts & (MOUNT_IOCHARSET|MOUNT_UTF8)) { |
if ((iocharset = gvm_iocharset ())) { | if ((iocharset = gvm_iocharset ())) { |
if ((opts & MOUNT_UTF8) && !strcmp (iocharset, "utf8")) { | if ((opts & MOUNT_UTF8) && !strcmp (iocharset, "utf8")) { |
|
Lines 1923-1928
gvm_device_mount (const char *udi, gbool
|
Link Here
|
|---|
|
snprintf (uid, sizeof (uid) - 1, "uid=%u", getuid ()); | snprintf (uid, sizeof (uid) - 1, "uid=%u", getuid ()); |
g_ptr_array_add (options, uid); | g_ptr_array_add (options, uid); |
} | } |
|
#endif |
| |
libhal_free_string (fstype); | libhal_free_string (fstype); |
} | } |
|
Lines 1947-1952
gvm_device_mount (const char *udi, gbool
|
Link Here
|
|---|
|
| |
g_ptr_array_free (options, TRUE); | g_ptr_array_free (options, TRUE); |
g_free (charset_opt); | g_free (charset_opt); |
|
g_free (locale_opt); |
| |
policy = g_new (struct _MountPolicy, 1); | policy = g_new (struct _MountPolicy, 1); |
policy->udi = g_strdup (udi); | policy->udi = g_strdup (udi); |
|
Lines 3185-3190
gvm_local_user (void)
|
Link Here
|
|---|
|
size_t n; | size_t n; |
DIR *dir; | DIR *dir; |
int vt; | int vt; |
|
#ifndef __linux__ |
|
int bytes, fd; |
|
struct stat sb; |
|
struct utmp buf[1024]; |
|
size_t len; |
|
#endif |
| |
if (local & LOCAL_USER_CHECKED) | if (local & LOCAL_USER_CHECKED) |
return (local & LOCAL_USER_FOUND); | return (local & LOCAL_USER_FOUND); |
|
Lines 3208-3213
gvm_local_user (void)
|
Link Here
|
|---|
|
| |
fallback: | fallback: |
| |
|
#ifdef __linux__ |
if (!(local & LOCAL_USER_FOUND)) { | if (!(local & LOCAL_USER_FOUND)) { |
setutent (); | setutent (); |
| |
|
Lines 3222-3227
gvm_local_user (void)
|
Link Here
|
|---|
|
| |
endutent (); | endutent (); |
} | } |
|
#else |
|
if ((fd = open (_PATH_WTMP, O_RDONLY, 0)) < 0 || fstat(fd, &sb) == -1) { |
|
close (fd); |
|
return TRUE; |
|
} |
|
|
|
len = (sb.st_size + sizeof(buf) - 1) / sizeof(buf); |
|
|
|
while (!local && --len >= 0) { |
|
if (lseek(fd, (off_t) (len * sizeof(buf)), L_SET) == -1 || |
|
(bytes = read (fd, buf, sizeof(buf))) == -1) { |
|
close (fd); |
|
return TRUE; |
|
} |
|
for (utmp = &buf[bytes / sizeof(buf[0]) - 1]; !local && utmp >= buf; --utmp) { |
|
if (!utmp->ut_name[0] || strncmp (utmp->ut_name, user, n) != 0) |
|
continue; |
|
local = utmp->ut_line[0] == ':' && utmp->ut_line[1] >= '0' && utmp->ut_line[1] <= '9' || !strncmp (utmp->ut_line, "ttyv", 4) ? LOCAL_USER_FOUND : 0; |
|
} |
|
} |
|
|
|
close (fd); |
|
#endif |
| |
local |= LOCAL_USER_CHECKED; | local |= LOCAL_USER_CHECKED; |
| |