#include "captive/storage.h" /* self */
#include "../client/giochannel-blind.h" /* for captive_giochannel_blind_get_size() */
+#include "../client/giochannel-subrange.h" /* for captive_giochannel_subrange_get_size() */
#include "../sandbox/client-CaptiveIOChannel.h" /* for captive_io_channel_get_size() */
#include <glib/gmessages.h>
#include <glib/gtypes.h>
* as including any Linux kernel include files is too much incompatible.
*/
#include <sys/mount.h> /* for 'BLKGETSIZE' */
+#include "iounixchannel.h"
-static guint64 size_blind(GIOChannel *iochannel)
+static guint64 size_subrange(GIOChannel *iochannel)
{
guint64 r;
g_return_val_if_fail(iochannel!=NULL,0);
- if (!captive_giochannel_blind_get_size(iochannel,&r))
+ if (!captive_giochannel_subrange_get_size(iochannel,&r))
return 0;
return r;
}
-static guint64 size_sandbox(GIOChannel *iochannel)
+static guint64 size_blind(GIOChannel *iochannel)
{
guint64 r;
g_return_val_if_fail(iochannel!=NULL,0);
- if (!captive_io_channel_get_size(iochannel,&r))
+ if (!captive_giochannel_blind_get_size(iochannel,&r))
return 0;
return r;
}
-static GIOChannel *iochannel_null;
-
-static int iounixchannel_get_fd(GIOChannel *iochannel)
+static guint64 size_sandbox(GIOChannel *iochannel)
{
-int r;
-
- g_return_val_if_fail(iochannel!=NULL,-1);
-
- if (!iochannel_null) {
-int fd;
-
- fd=open("/dev/null",O_RDONLY);
- g_return_val_if_fail(fd!=-1,-1);
- iochannel_null=g_io_channel_unix_new(fd);
- g_return_val_if_fail(iochannel_null!=NULL,-1);
- }
+guint64 r;
- if (iochannel->funcs!=iochannel_null->funcs) {
- /* Not a UNIX file descriptor */
- return -1;
- }
+ g_return_val_if_fail(iochannel!=NULL,0);
- /* It is forbidden to callg_io_channel_unix_get_fd()
- * if you are not sure it is a 'GIOUnixChannel'.
- */
- r=g_io_channel_unix_get_fd(iochannel);
- g_return_val_if_fail(r!=-1,-1);
+ if (!captive_io_channel_get_size(iochannel,&r))
+ return 0;
return r;
}
-static guint64 size_ioctl(GIOChannel *iochannel)
+guint64 captive_giochannel_size_ioctl(GIOChannel *iochannel)
{
int fd;
guint64 r;
g_return_val_if_fail(iochannel!=NULL,0);
- if (-1==(fd=iounixchannel_get_fd(iochannel)))
+ if (-1==(fd=captive_iounixchannel_get_fd(iochannel)))
return 0;
#ifdef BLKGETSIZE64
*/
g_return_val_if_fail(sizeof(offset)==sizeof(guint64),0);
- if (-1==(fd=iounixchannel_get_fd(iochannel)))
+ if (-1==(fd=captive_iounixchannel_get_fd(iochannel)))
return 0;
if (-1==(offset_orig=lseek(fd,0,SEEK_CUR)))
{
guint64 r;
+ if ((r=size_subrange(iochannel)))
+ return r;
if ((r=size_blind(iochannel)))
return r;
if ((r=size_sandbox(iochannel)))
return r;
- if ((r=size_ioctl(iochannel)))
+ if ((r=captive_giochannel_size_ioctl(iochannel)))
return r;
if ((r=size_seek(iochannel)))
return r;