summaryrefslogtreecommitdiffstats
path: root/perl-install/c/stuff.xs.pl
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/c/stuff.xs.pl')
-rw-r--r--perl-install/c/stuff.xs.pl579
1 files changed, 579 insertions, 0 deletions
diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl
new file mode 100644
index 000000000..2253c419e
--- /dev/null
+++ b/perl-install/c/stuff.xs.pl
@@ -0,0 +1,579 @@
+use Config;
+
+print '
+#include "EXTERN.h"
+#include "perl.h"
+#include "XSUB.h"
+
+/* workaround for glibc and kernel header files not in sync */
+#define dev_t dev_t
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <fcntl.h>
+#include <resolv.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+#include <sys/stat.h>
+#include <sys/utsname.h>
+#include <sys/mount.h>
+#include <linux/keyboard.h>
+#include <linux/kd.h>
+#include <linux/hdreg.h>
+#include <linux/vt.h>
+#include <linux/fd.h>
+#include <linux/cdrom.h>
+#include <linux/loop.h>
+#include <linux/blkpg.h>
+#include <net/if.h>
+#include <net/route.h>
+
+/* for is_ext3 */
+#include <ext2fs/ext2_fs.h>
+#include <ext2fs/ext2fs.h>
+
+#include <libldetect.h>
+#include <X11/Xlib.h>
+#include <X11/extensions/xf86misc.h>
+
+#include <langinfo.h>
+#include <string.h>
+#include <iconv.h>
+
+#include <libintl.h>
+#include <term.h>
+#undef max_colors
+
+#define SECTORSIZE 512
+
+char *prom_getopt();
+void prom_setopt();
+char *prom_getproperty();
+char *disk2PromPath();
+char *promRootName();
+
+';
+
+$ENV{C_DRAKX} && $Config{archname} =~ /i.86/ and print '
+char *pcmcia_probe(void);
+';
+
+$ENV{C_RPM} and print '
+#undef Fflush
+#undef Mkdir
+#undef Stat
+#include <rpm/rpmlib.h>
+#include <rpm/rpmio.h>
+
+void rpmError_callback_empty(void) {}
+
+int rpmError_callback_data;
+void rpmError_callback(void) {
+ if (rpmErrorCode() != RPMERR_UNLINK && rpmErrorCode() != RPMERR_RMDIR) {
+ write(rpmError_callback_data, rpmErrorString(), strlen(rpmErrorString()));
+ }
+}
+
+';
+
+$ENV{C_DRAKX} and print '
+
+#include <gdk/gdkx.h>
+
+void initIMPS2() {
+ unsigned char imps2_s1[] = { 243, 200, 243, 100, 243, 80, };
+ unsigned char imps2_s2[] = { 246, 230, 244, 243, 100, 232, 3, };
+
+ int fd = open("/dev/cdrom", O_WRONLY);
+ if (fd < 0) return;
+
+ write (fd, imps2_s1, sizeof (imps2_s1));
+ usleep (30000);
+ write (fd, imps2_s2, sizeof (imps2_s2));
+ usleep (30000);
+ tcflush (fd, TCIFLUSH);
+ tcdrain(fd);
+}
+
+void log_message(const char * s, ...) {}
+
+';
+
+print '
+
+MODULE = c::stuff PACKAGE = c::stuff
+
+';
+
+$ENV{C_DRAKX} && $Config{archname} =~ /i.86/ and print '
+char *
+pcmcia_probe()
+';
+
+$ENV{C_DRAKX} and print '
+
+int
+Xtest(display)
+ char *display
+ CODE:
+ int pid;
+ if ((pid = fork()) == 0) {
+ Display *d = XOpenDisplay(display);
+ if (d) {
+ XSetCloseDownMode(d, RetainPermanent);
+ XCloseDisplay(d);
+ }
+ _exit(d != NULL);
+ }
+ waitpid(pid, &RETVAL, 0);
+ OUTPUT:
+ RETVAL
+
+void
+setMouseLive(display, type, emulate3buttons)
+ char *display
+ int type
+ int emulate3buttons
+ CODE:
+ {
+ XF86MiscMouseSettings mseinfo;
+ Display *d = XOpenDisplay(display);
+ if (d) {
+ if (XF86MiscGetMouseSettings(d, &mseinfo) == True) {
+ mseinfo.type = type;
+ mseinfo.flags |= MF_REOPEN;
+ mseinfo.emulate3buttons = emulate3buttons;
+ XF86MiscSetMouseSettings(d, &mseinfo);
+ XFlush(d);
+ if (type == MTYPE_IMPS2) initIMPS2();
+ }
+ }
+ }
+';
+
+print '
+
+int
+add_partition(hd, start_sector, size_sector, part_number)
+ int hd
+ unsigned long start_sector
+ unsigned long size_sector
+ int part_number
+ CODE:
+ {
+ long long start = start_sector * 512;
+ long long size = size_sector * 512;
+ struct blkpg_partition p = { start, size, part_number, "", "" };
+ struct blkpg_ioctl_arg s = { BLKPG_ADD_PARTITION, 0, sizeof(struct blkpg_partition), (void *) &p };
+ RETVAL = ioctl(hd, BLKPG, &s) == 0;
+ }
+ OUTPUT:
+ RETVAL
+
+int
+is_secure_file(filename)
+ char * filename
+ CODE:
+ {
+ int fd;
+ unlink(filename); /* in case it exists and we manage to remove it */
+ RETVAL = (fd = open(filename, O_RDWR | O_CREAT | O_EXCL, 0600)) != -1;
+ if (RETVAL) close(fd);
+ }
+ OUTPUT:
+ RETVAL
+
+int
+is_ext3(device_name)
+ char * device_name
+ CODE:
+ {
+ ext2_filsys fs;
+ int retval = ext2fs_open (device_name, 0, 0, 0, unix_io_manager, &fs);
+ if (retval) {
+ RETVAL = 0;
+ } else {
+ RETVAL = fs->super->s_feature_compat & EXT3_FEATURE_COMPAT_HAS_JOURNAL;
+ ext2fs_close(fs);
+ }
+ }
+ OUTPUT:
+ RETVAL
+
+void
+setlocale()
+ CODE:
+ setlocale(LC_ALL, "");
+ setlocale(LC_NUMERIC, "C"); /* otherwise eval "1.5" returns 1 in fr_FR for example */
+
+char *
+bindtextdomain(domainname, dirname)
+ char * domainname
+ char * dirname
+
+char *
+dgettext(domainname, msgid)
+ char * domainname
+ char * msgid
+
+int
+KTYP(x)
+ int x
+ CODE:
+ RETVAL = KTYP(x);
+ OUTPUT:
+ RETVAL
+
+int
+lseek_sector(fd, sector, offset)
+ int fd
+ long sector
+ long offset
+ CODE:
+ RETVAL = lseek64(fd, (off64_t) sector * SECTORSIZE + offset, SEEK_SET) >= 0;
+ OUTPUT:
+ RETVAL
+
+int
+isBurner(fd)
+ int fd
+ CODE:
+ RETVAL = ioctl(fd, CDROM_GET_CAPABILITY) & CDC_CD_RW;
+ OUTPUT:
+ RETVAL
+
+int
+isDvdDrive(fd)
+ int fd
+ CODE:
+ RETVAL = ioctl(fd, CDROM_GET_CAPABILITY) & CDC_DVD;
+ OUTPUT:
+ RETVAL
+
+char *
+floppy_info(name)
+ char * name
+ CODE:
+ int fd = open(name, O_RDONLY | O_NONBLOCK);
+ RETVAL = NULL;
+ if (fd != -1) {
+ char drivtyp[17];
+ ioctl(fd, FDGETDRVTYP, (void *)drivtyp);
+ RETVAL = drivtyp;
+ close(fd);
+ }
+ OUTPUT:
+ RETVAL
+
+unsigned int
+total_sectors(fd)
+ int fd
+ CODE:
+ {
+ long s;
+ RETVAL = ioctl(fd, BLKGETSIZE, &s) == 0 ? s : 0;
+ }
+ OUTPUT:
+ RETVAL
+
+void
+unlimit_core()
+ CODE:
+ {
+ struct rlimit rlim = { RLIM_INFINITY, RLIM_INFINITY };
+ setrlimit(RLIMIT_CORE, &rlim);
+ }
+
+int
+getlimit_core()
+ CODE:
+ {
+ struct rlimit rlim;
+ getrlimit(RLIMIT_CORE, &rlim);
+ RETVAL = rlim.rlim_cur;
+ }
+ OUTPUT:
+ RETVAL
+
+void
+openlog(ident)
+ char *ident
+ CODE:
+ openlog(ident, 0, 0);
+
+void
+closelog()
+
+void
+syslog(priority, mesg)
+ int priority
+ char *mesg
+ CODE:
+ syslog(priority, mesg);
+
+void
+setsid()
+
+void
+_exit(status)
+ int status
+
+int
+detectSMP()
+
+void
+pci_probe(probe_type)
+ int probe_type
+ PPCODE:
+ struct pciusb_entries entries = pci_probe(probe_type);
+ char buf[2048];
+ int i;
+
+ EXTEND(SP, entries.nb);
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry e = entries.entries[i];
+ snprintf(buf, sizeof(buf), "%04x\t%04x\t%04x\t%04x\t%d\t%d\t%d\t%s\t%s\t%s",
+ e.vendor, e.device, e.subvendor, e.subdevice, e.pci_bus, e.pci_device, e.pci_function,
+ pci_class2text(e.class_), e.module ? e.module : "unknown", e.text);
+ PUSHs(sv_2mortal(newSVpv(buf, 0)));
+ }
+ pciusb_free(&entries);
+
+void
+usb_probe()
+ PPCODE:
+ struct pciusb_entries entries = usb_probe();
+ char buf[2048];
+ int i;
+
+ EXTEND(SP, entries.nb);
+ for (i = 0; i < entries.nb; i++) {
+ struct pciusb_entry e = entries.entries[i];
+ snprintf(buf, sizeof(buf), "%04x\t%04x\t%s\t%s\t%s",
+ e.vendor, e.device, usb_class2text(e.class_), e.module ? e.module : "unknown", e.text);
+ PUSHs(sv_2mortal(newSVpv(buf, 0)));
+ }
+ pciusb_free(&entries);
+
+unsigned int
+getpagesize()
+
+int
+hasNetDevice(device)
+ char * device
+ CODE:
+ struct ifreq req;
+ int s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s == -1) { RETVAL = 0; return; }
+
+ strcpy(req.ifr_name, device);
+
+ RETVAL = ioctl(s, SIOCGIFFLAGS, &req) == 0;
+ close(s);
+ OUTPUT:
+ RETVAL
+
+int
+addDefaultRoute(gateway)
+ char *gateway
+ CODE:
+ struct rtentry route;
+ struct sockaddr_in addr;
+ int s = socket(AF_INET, SOCK_DGRAM, 0);
+ if (s == -1) { RETVAL = 0; return; }
+
+ memset(&route, 0, sizeof(route));
+
+ addr.sin_family = AF_INET;
+ addr.sin_port = 0;
+ inet_aton(gateway, &addr.sin_addr);
+ memcpy(&route.rt_gateway, &addr, sizeof(addr));
+
+ addr.sin_addr.s_addr = INADDR_ANY;
+ memcpy(&route.rt_dst, &addr, sizeof(addr));
+ memcpy(&route.rt_genmask, &addr, sizeof(addr));
+
+ route.rt_flags = RTF_UP | RTF_GATEWAY;
+ route.rt_metric = 0;
+
+ RETVAL = !ioctl(s, SIOCADDRT, &route);
+ OUTPUT:
+ RETVAL
+
+char *
+kernel_version()
+ CODE:
+ struct utsname u;
+ if (uname(&u) == 0) RETVAL = u.release; else RETVAL = NULL;
+ OUTPUT:
+ RETVAL
+
+int
+prom_open()
+
+void
+prom_close()
+
+int
+prom_getsibling(node)
+ int node
+
+int
+prom_getchild(node)
+ int node
+
+void
+prom_getopt(key)
+ char *key
+ PPCODE:
+ int lenp = 0;
+ char *value = NULL;
+ value = prom_getopt(key, &lenp);
+ EXTEND(sp, 1);
+ if (value != NULL) {
+ PUSHs(sv_2mortal(newSVpv(value, 0)));
+ } else {
+ PUSHs(&PL_sv_undef);
+ }
+
+void
+prom_setopt(key, value)
+ char *key
+ char *value
+
+void
+prom_getproperty(key)
+ char *key
+ PPCODE:
+ int lenp = 0;
+ char *value = NULL;
+ value = prom_getproperty(key, &lenp);
+ EXTEND(sp, 1);
+ if (value != NULL) {
+ PUSHs(sv_2mortal(newSVpv(value, lenp)));
+ } else {
+ PUSHs(&PL_sv_undef);
+ }
+
+void
+prom_getstring(key)
+ char *key
+ PPCODE:
+ int lenp = 0;
+ char *value = NULL;
+ value = prom_getproperty(key, &lenp);
+ EXTEND(sp, 1);
+ if (value != NULL) {
+ PUSHs(sv_2mortal(newSVpv(value, 0)));
+ } else {
+ PUSHs(&PL_sv_undef);
+ }
+
+int
+prom_getbool(key)
+ char *key
+
+void
+initSilo()
+
+char *
+disk2PromPath(disk)
+ unsigned char *disk
+
+int
+hasAliases()
+
+char *
+promRootName()
+
+void
+setPromVars(linuxAlias, bootDevice)
+ char *linuxAlias
+ char *bootDevice
+
+char *
+iconv(s, from_charset, to_charset)
+ char *s
+ char *from_charset
+ char *to_charset
+ CODE:
+ iconv_t cd = iconv_open(to_charset, from_charset);
+ RETVAL = s;
+ if (cd != (iconv_t) (-1)) {
+ size_t s_len = strlen(RETVAL);
+ char *buf = alloca(3 * s_len + 10); /* 10 for safety, it should not be needed */
+ {
+ char *ptr = buf;
+ size_t ptr_len = 3 * s_len + 10;
+ if ((iconv(cd, &s, &s_len, &ptr, &ptr_len)) != (size_t) (-1)) {
+ *ptr = 0;
+ RETVAL = buf;
+ }
+ }
+ iconv_close(cd);
+ }
+ OUTPUT:
+ RETVAL
+
+char *
+standard_charset()
+ CODE:
+ RETVAL = nl_langinfo(CODESET);
+ OUTPUT:
+ RETVAL
+
+';
+
+$ENV{C_RPM} and print '
+char *
+rpmErrorString()
+
+void
+rpmSetVeryVerbose()
+ CODE:
+ rpmSetVerbosity(RPMMESS_DEBUG);
+
+void
+rpmErrorSetCallback(fd)
+ int fd
+ CODE:
+ rpmError_callback_data = fd;
+ rpmErrorSetCallback(rpmError_callback);
+
+int
+rpmvercmp(char *a, char *b);
+';
+
+@macros = (
+ [ qw(int S_IFCHR S_IFBLK S_IFIFO KDSKBENT KT_SPEC NR_KEYS MAX_NR_KEYMAPS BLKRRPART TIOCSCTTY
+ HDIO_GETGEO BLKGETSIZE LOOP_GET_STATUS
+ MS_MGC_VAL MS_RDONLY O_NONBLOCK F_SETFL F_GETFL O_CREAT SECTORSIZE WNOHANG
+ VT_ACTIVATE VT_WAITACTIVE VT_GETSTATE CDROM_LOCKDOOR CDROMEJECT
+ LOG_WARNING LOG_INFO LOG_LOCAL1
+ ) ],
+);
+
+$\= "\n";
+print;
+
+foreach (@macros) {
+ my ($type, @l) = @$_;
+ foreach (@l) {
+ print<< "END"
+$type
+$_()
+ CODE:
+ RETVAL = $_;
+
+ OUTPUT:
+ RETVAL
+
+END
+
+ }
+}