diff options
author | Michael Meeks <michael.meeks@novell.com> | 2011-05-04 21:35:31 +0100 |
---|---|---|
committer | Michael Meeks <michael.meeks@novell.com> | 2011-05-06 14:53:43 +0100 |
commit | 55a5d4c611a84e29569ee00c610e10809e070e3e (patch) | |
tree | 68ecfb531b55c1545821ad04a42121f3ee151f78 /desktop/unx | |
parent | df0071f0ac5cd29f7a9220639aaf54d0dd3269f7 (diff) |
kill standalone pagein, it is now an integral part of oosplash.bin
Diffstat (limited to 'desktop/unx')
-rwxr-xr-x | desktop/unx/source/file_image.h | 81 | ||||
-rwxr-xr-x | desktop/unx/source/file_image_unx.c | 153 | ||||
-rwxr-xr-x | desktop/unx/source/makefile.mk | 2 | ||||
-rwxr-xr-x | desktop/unx/source/pagein.c | 162 |
4 files changed, 397 insertions, 1 deletions
diff --git a/desktop/unx/source/file_image.h b/desktop/unx/source/file_image.h new file mode 100755 index 000000000000..4d081713a736 --- /dev/null +++ b/desktop/unx/source/file_image.h @@ -0,0 +1,81 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef INCLUDED_FILE_IMAGE_H +#define INCLUDED_FILE_IMAGE_H + +#ifndef INCLUDED_STDDEF_H +#include <stddef.h> +#define INCLUDED_STDDEF_H +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** file_image. + */ +struct file_image_st +{ + void * m_base; + size_t m_size; +}; + +typedef struct file_image_st file_image; + +#define FILE_IMAGE_INITIALIZER { 0, 0 } + + +/** file_image_open. + */ +int file_image_open ( + file_image * image, + const char * filename); + + +/** file_image_pagein. + */ +int file_image_pagein ( + file_image * image); + + +/** file_image_close. + */ +int file_image_close ( + file_image * image); + + +/** Epilog. + */ +#ifdef __cplusplus +} +#endif + +#endif /* INCLUDED_ODEP_IMAGE_H */ + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/desktop/unx/source/file_image_unx.c b/desktop/unx/source/file_image_unx.c new file mode 100755 index 000000000000..fa1af9248d60 --- /dev/null +++ b/desktop/unx/source/file_image_unx.c @@ -0,0 +1,153 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "file_image.h" + +#include <unistd.h> + +#include <errno.h> +#include <fcntl.h> + +#if defined(LINUX) +# ifndef __USE_BSD +# define __USE_BSD /* madvise, MADV_WILLNEED */ +# endif +#endif /* Linux */ + +#include <sys/mman.h> +#include <sys/stat.h> + +#include <string.h> + +/* + * file_image_open + */ +int file_image_open (file_image * image, const char * filename) +{ + int result = 0; + int fd; + struct stat st; + void * p; + + if (image == 0) + return (EINVAL); + + image->m_base = MAP_FAILED, image->m_size = 0; + + if ((fd = open (filename, O_RDONLY)) == -1) + return (errno); + + if (fstat (fd, &st) == -1) + { + result = errno; + goto cleanup_and_leave; + } + + p = mmap (0, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (p == MAP_FAILED) + { + result = errno; + goto cleanup_and_leave; + } + + image->m_base = p, image->m_size = st.st_size; + +cleanup_and_leave: + close (fd); + return (result); +} + +/* + * file_image_pagein. + */ +int file_image_pagein (file_image * image) +{ + file_image w; + long s; + size_t k; + volatile char c = 0; + + if (image == 0) + return (EINVAL); + + if ((w.m_base = image->m_base) == 0) + return (EINVAL); + if ((w.m_size = image->m_size) == 0) + return (0); + + if (madvise (w.m_base, w.m_size, MADV_WILLNEED) == -1) + { +#ifndef MACOSX + return (errno); +#else + /* madvise MADV_WILLNEED need not succeed here */ + /* but that is fine */ +#endif + } + + +#ifndef MACOSX + if ((s = sysconf (_SC_PAGESIZE)) == -1) + s = 0x1000; +#else + s = getpagesize(); +#endif + + k = (size_t)(s); + while (w.m_size > k) + { + c ^= ((char*)(w.m_base))[0]; + w.m_base = (char*)(w.m_base) + k; + w.m_size -= k; + } + if (w.m_size > 0) + { + c ^= ((char*)(w.m_base))[0]; + w.m_base = (char*)(w.m_base) + w.m_size; + w.m_size -= w.m_size; + } + + return (0); +} + +/* + * file_image_close + */ +int file_image_close (file_image * image) +{ + if (image == 0) + return (EINVAL); + + if (munmap (image->m_base, image->m_size) == -1) + return (errno); + + image->m_base = 0, image->m_size = 0; + return (0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/desktop/unx/source/makefile.mk b/desktop/unx/source/makefile.mk index 5c5c8f3e9e88..ad68ca95135b 100755 --- a/desktop/unx/source/makefile.mk +++ b/desktop/unx/source/makefile.mk @@ -45,7 +45,7 @@ OBJFILES= \ $(OBJ)$/args.obj .IF "$(OS)"!="MACOSX" -PAGEIN_OBJS= \ +OBJFILES += \ $(OBJ)$/pagein.obj \ $(OBJ)$/file_image_unx.obj .ENDIF diff --git a/desktop/unx/source/pagein.c b/desktop/unx/source/pagein.c new file mode 100755 index 000000000000..947b4b7375d5 --- /dev/null +++ b/desktop/unx/source/pagein.c @@ -0,0 +1,162 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org 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 Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include "file_image.h" + +#include <unistd.h> +#include <errno.h> +#include <stdio.h> +#include <string.h> + +/* do_pagein */ +static int do_pagein (const char * filename, size_t * size) +{ + int result; + file_image image = FILE_IMAGE_INITIALIZER; + + if ((result = file_image_open (&image, filename)) != 0) + return (result); + + if ((result = file_image_pagein (&image)) != 0) + { + fprintf (stderr, "file_image_pagein %s: %s\n", filename, strerror(result)); + goto cleanup_and_leave; + } + + if (size) + { + *size = image.m_size; + } + +cleanup_and_leave: + file_image_close (&image); + return (result); +} + +extern int pagein_execute (int argc, char **argv); + +/* main */ +int pagein_execute (int argc, char **argv) +{ + int i, v = 0; + size_t nfiles = 0, nbytes = 0; + + if (argc < 2) + { + fprintf ( + stderr, + "%s: Usage: pagein [-v[v]] [-L<path>] [@]<filename> ...\n", + argv[0]); + return (1); + } + + for (i = 1; i < argc; i++) + { + FILE * fp = 0; + size_t k = 0; + + if (argv[i][0] == '-') + { + /* option */ + int j = 1; + switch (argv[i][j]) + { + case 'v': + /* verbosity level */ + for (v += 1, j += 1; argv[i][j]; j++) + v += (argv[i][j] == 'v'); + break; + case 'L': + /* search path */ + if (chdir (&(argv[i][2])) == -1) + fprintf (stderr, "chdir %s: %s\n", &(argv[i][2]), strerror(errno)); + break; + default: + /* ignored */ + break; + } + + /* next argv */ + continue; + } + + if ((argv[i][0] == '@') && ((fp = fopen (argv[i], "r")) == 0)) + { + char fullpath[4096]; + char *path; + strncpy (fullpath, argv[i] + 1, 3000); + if (!(path = strrchr (fullpath, '/'))) + path = fullpath; + else + path++; + + if ((fp = fopen (&(argv[i][1]), "r")) == 0) + { + fprintf (stderr, "fopen %s: %s\n", &(argv[i][1]), strerror(errno)); + continue; + } + while (fgets (path, 1024, fp) != 0) + { + path[strlen(path) - 1] = '\0', k = 0; + + /* paths relative to the location of the pagein file */ + if (do_pagein (fullpath, &k) == 0) + { + /* accumulate total size */ + nbytes += k; + } + + if (v >= 2) + fprintf (stderr, "pagein(\"%s\") = %d bytes\n", path, (int) k); + nfiles += 1; + } + fclose (fp); + } + else + { + if (fp != 0) + fclose (fp); + + if (do_pagein (argv[i], &k) == 0) + { + /* accumulate total size */ + nbytes += k; + } + + if (v >= 2) + fprintf (stderr, "pagein(\"%s\") = %d bytes\n", argv[i], (int) k); + nfiles += 1; + } + } + + if (v >= 1) + fprintf (stderr, "Total: %d files (%d bytes)\n", (int) nfiles, (int) nbytes); + return (0); +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |