diff options
Diffstat (limited to 'src/xine-engine/nvtvd.c')
-rw-r--r-- | src/xine-engine/nvtvd.c | 815 |
1 files changed, 0 insertions, 815 deletions
diff --git a/src/xine-engine/nvtvd.c b/src/xine-engine/nvtvd.c deleted file mode 100644 index 5a9f2d84a..000000000 --- a/src/xine-engine/nvtvd.c +++ /dev/null @@ -1,815 +0,0 @@ -/* - * Copyright (C) 2000-2002 the xine project - * - * This file is part of xine, a free video player. - * - * xine is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * xine 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 - * - * $Id: nvtvd.c,v 1.3 2002/10/23 17:12:32 guenter Exp $ - * - * nvtvd - Routines for communication with nvtvd. - * - * This is the combination of several files from the nvtvd package - * by Dirk Thierbach <dthierbach@gmx.de>. They have been inserted into - * one single file in order not to clutter the source filespace too much. - * The only change has been the removal of some '#include' statements, - * and only a small fraction from debug.h has been included. - * - * This file contains (in this order): - * pipe.h debug.h back_client.c pipe.c - */ - -#include "nvtvd.h" - - -/* NVTV pipe header -- Dirk Thierbach <dthierbach@gmx.de> - * - * This file is part of nvtv, a tool for tv-output on NVidia cards. - * - * nvtv is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * nvtv 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 - * - * $Id: nvtvd.c,v 1.3 2002/10/23 17:12:32 guenter Exp $ - * - * Contents: - * - * Routine prototypes to access the named pipe for server/client - * communication, and communication protocol constants. - * - */ - -#ifndef _PIPE_H -#define _PIPE_H - -#define PIPE_IN "/tmp/.nvtv-in" -#define PIPE_OUT "/tmp/.nvtv-out" - -#define PIPE_VERSION 2 /* 0.3.1 */ - -/* even commands expect no return, odd commands do */ - -typedef enum { - PCmd_None = 0, /* In: None */ - PCmd_Init = 1, /* In: None; Out: card list */ - PCmd_Kill = 2, /* In: None */ - PCmd_Version = 3, /* In: None; Out: version */ - PCmd_CloseCard = 10, /* In: None */ - PCmd_OpenCard = 11, /* In: Card index; Out: chip list */ - PCmd_SetChip = 12, /* In: Chip index, init; */ - PCmd_ProbeChips = 13, /* In: None; Out: chip list */ - PCmd_SetSettings = 14, /* In: Settings; */ - PCmd_GetSettings = 15, /* In: None; Out: Settings */ - PCmd_SetMode = 16, /* In: Flags, crt, tv; */ - PCmd_GetMode = 17, /* In: None; Out: Crt, tv */ - PCmd_SetModeSettings = 18, /* In: Flags, crt, tv, set; */ - PCmd_SetTestImage = 20, /* In: Flags, tv, set; */ - PCmd_GetStatus = 23, /* In: Index; Out: status */ - PCmd_GetConnection = 25, /* In: None; Out: connect */ - PCmd_FindBySize = 31, /* In: System, x, y, size; Out: mode */ - PCmd_FindByOverscan = 33, /* In: System, x, y, hoc, voc; Out: mode */ - PCmd_SetHeads = 40, /* In: 3 heads */ - PCmd_GetHeads = 41, /* In: None; Out: 3 heads */ - PCmd_InitSharedView = 51, /* In: None; Out: 4 int */ - PCmd_GetTwinView = 53, /* In: None; Out: 2 int, bool */ - PCmd_AdjustView = 55, /* In: 3 int; Out: 2 int, bool */ - PCmd_ServiceVC = 57, /* In: 5 int; Out: 2 int, bool */ -} PipeCmd; - -PipeCmd pipeReadCmd (FILE *pipe); -void pipeWriteCmd (FILE *pipe, PipeCmd cmd); - -int pipeReadArgs (FILE *pipe, int n, ...); -int pipeReadArgsOpt (FILE *pipe, int n, ...); -void pipeWriteArgs (FILE *pipe, int n, ...); - -void* pipeReadList (FILE *pipe, int size); -void pipeWriteList (FILE *pipe, int size, void *list); - -#endif /* _PIPE_H */ - -#if __GNUC__ -/* excerpt from debug.h */ -#define ERROR(X...) fprintf(stderr, X) - -/* Fake output */ -#define FPRINTF(X...) fprintf(stderr, X) - -#ifdef NVTV_DEBUG -#define DPRINTF(X...) fprintf(stderr, X) -#define NO_TIMEOUT -#else -#define DPRINTF(X...) /* */ -#endif - -#else /* !__GNUC__ */ - -/* excerpt from debug.h */ -#define ERROR(...) fprintf(stderr, __VA_ARGS__) - -/* Fake output */ -#define FPRINTF(...) fprintf(stderr, __VA_ARGS__) - -#ifdef NVTV_DEBUG -#define DPRINTF(...) fprintf(stderr, __VA_ARGS__) -#define NO_TIMEOUT -#else -#define DPRINTF(...) /* */ -#endif -#endif - -/* NVTV client backend -- Dirk Thierbach <dthierbach@gmx.de> - * - * This file is part of nvtv, a tool for tv-output on NVidia cards. - * - * nvtv is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * nvtv 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 - * - * $Id: nvtvd.c,v 1.3 2002/10/23 17:12:32 guenter Exp $ - * - * Contents: - * - * Client backend for accessing the server - * - */ - -#include <string.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> - -/* -------- State -------- */ - -static FILE *pipe_in = NULL; -static FILE *pipe_out = NULL; - -static CardPtr bcl_root = NULL; -static CardPtr bcl_card = NULL; - -/* -------- Driver routines -------- */ - -void bcl_openPipes (void) -{ - /* IMPORTANT: Open out pipe first, otherwise deadlock */ - pipe_out = fopen (PIPE_OUT, "w"); - pipe_in = fopen (PIPE_IN, "r"); -} - -void bcl_closePipes (void) -{ - fclose (pipe_in ); - fclose (pipe_out); -} - -void bcl_openCard (CardPtr card) -{ - CardPtr c; - int i, index; - - DPRINTF ("bcl_open\n"); - bcl_card = card; - bcl_openPipes (); - /* convert card to index */ - i = index = 0; - for (c = bcl_root; c; c = c->next) { - i++; - if (c == card) index = i; - } - pipeWriteCmd (pipe_out, PCmd_OpenCard); - pipeWriteArgs (pipe_out, 1, sizeof(index), &index); - pipeReadCmd (pipe_in); - bcl_card->chips = pipeReadList (pipe_in, sizeof (ChipInfo)); -} - -void bcl_closeCard (void) -{ - DPRINTF ("bcl_close\n"); - pipeWriteCmd (pipe_out, PCmd_CloseCard); - pipeWriteArgs (pipe_out, 0); - bcl_closePipes (); -} - -void bcl_setHeads (int main, int tv, int video) -{ - DPRINTF ("bcl_setHeads %i %i %i\n", main, tv, video); - pipeWriteCmd (pipe_out, PCmd_SetHeads); - pipeWriteArgs (pipe_out, 3, sizeof(int), &main, sizeof(int), &tv, - sizeof(int), &video); -} - -void bcl_getHeads (int *main, int *tv, int *video, int *max) -{ - DPRINTF ("bcl_getHeads\n"); - pipeWriteCmd (pipe_out, PCmd_GetHeads); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 4, sizeof(int), main, sizeof(int), tv, - sizeof(int), video, sizeof(int), max); -} - -void bcl_probeChips (void) -{ - ChipPtr chip, del; - - DPRINTF ("bcl_probe\n"); - chip = bcl_card->chips; - while (chip) { - del = chip; - chip = chip->next; - free (del->name); - free (del); - } - pipeWriteCmd (pipe_out, PCmd_ProbeChips); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - bcl_card->chips = pipeReadList (pipe_in, sizeof (ChipInfo)); -} - -void bcl_setChip (ChipPtr chip, Bool init) -{ - ChipPtr c; - int i, index; - - DPRINTF ("bcl_setChip %s %i\n", chip->name, init); - /* convert chip to index */ - i = index = 0; - for (c = bcl_card->chips; c; c = c->next) { - i++; - if (c == chip) index = i; - } - pipeWriteCmd (pipe_out, PCmd_SetChip); - pipeWriteArgs (pipe_out, 2, sizeof(index), &index, sizeof(init), &init); -} - -void bcl_setSettings (TVSettings *set) -{ - DPRINTF ("bcl_setSettings\n"); - pipeWriteCmd (pipe_out, PCmd_SetSettings); - pipeWriteArgs (pipe_out, 1, sizeof(TVSettings), set); -} - -void bcl_getSettings (TVSettings *set) -{ - DPRINTF ("bcl_getSettings\n"); - pipeWriteCmd (pipe_out, PCmd_GetSettings); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 1, sizeof(TVSettings), set); -} - -void bcl_setMode (int ModeFlags, TVCrtRegs *crt, TVRegs *tv) -{ - DPRINTF ("bcl_setMode\n"); - pipeWriteCmd (pipe_out, PCmd_SetMode); - pipeWriteArgs (pipe_out, 3, sizeof(ModeFlags), &ModeFlags, - sizeof(TVCrtRegs), crt, sizeof(TVRegs), tv); -} - -void bcl_getMode (TVCrtRegs *crt, TVRegs *tv) -{ - DPRINTF ("bcl_getMode\n"); - pipeWriteCmd (pipe_out, PCmd_GetMode); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 2, sizeof(TVCrtRegs), crt, sizeof(TVRegs), tv); -} - -void bcl_setModeSettings (int ModeFlags, TVCrtRegs *crt, - TVRegs *tv, TVSettings *set) -{ - DPRINTF ("bcl_setModeSettings\n"); - pipeWriteCmd (pipe_out, PCmd_SetModeSettings); - pipeWriteArgs (pipe_out, 4, sizeof(ModeFlags), &ModeFlags, - sizeof(TVCrtRegs), crt, sizeof(TVRegs), tv, - sizeof(TVSettings), set); -} - -void bcl_setTestImage (int ModeFlags, TVRegs *tv, TVSettings *set) -{ - DPRINTF ("bcl_setTestImage\n"); - pipeWriteCmd (pipe_out, PCmd_SetTestImage); - pipeWriteArgs (pipe_out, 3, sizeof(int), &ModeFlags, - sizeof(TVRegs), tv, sizeof(TVSettings), set); -} - -long bcl_getStatus (int index) -{ - long l; - - DPRINTF ("bcl_getStatus\n"); - pipeWriteCmd (pipe_out, PCmd_GetStatus); - pipeWriteArgs (pipe_out, 1, sizeof(index), &index); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 1, sizeof(l), &l); - return l; -} - -TVConnect bcl_getConnection (void) -{ - TVConnect c; - - DPRINTF ("bcl_getConnection\n"); - pipeWriteCmd (pipe_out, PCmd_GetConnection); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 1, sizeof(c), &c); - DPRINTF ("bcl_getConnection got %i\n", c); - return c; -} - -Bool bcl_findBySize (TVSystem system, int xres, int yres, char *size, - TVMode *mode, TVCrtRegs *crt, TVRegs *tv) -{ - int n; - - DPRINTF ("bcl_findBySize %i %i,%i %s\n", system, xres, yres, size); - pipeWriteCmd (pipe_out, PCmd_FindBySize); - pipeWriteArgs (pipe_out, 4, sizeof(system), &system, - sizeof(xres), &xres, sizeof(yres), &yres, - strlen(size)+1, size); - pipeReadCmd (pipe_in); - n = pipeReadArgs (pipe_in, 3, sizeof(TVMode), mode, - sizeof(TVCrtRegs), crt, sizeof(TVRegs), tv); - if (mode) { - mode->crt = crt; - mode->tv = tv; - } - return (n >= 1); -} - -Bool bcl_findByOverscan (TVSystem system, int xres, int yres, - double hoc, double voc, TVMode *mode, TVCrtRegs *crt, TVRegs *tv) -{ - int n; - - DPRINTF ("bcl_findByOC %i %i,%i\n", system, xres, yres); - pipeWriteCmd (pipe_out, PCmd_FindByOverscan); - pipeWriteArgs (pipe_out, 5, sizeof(system), &system, - sizeof(xres), &xres, sizeof(yres), &yres, - sizeof(hoc), &hoc, sizeof(voc), &voc); - pipeReadCmd (pipe_in); - n = pipeReadArgs (pipe_in, 3, sizeof(TVMode), mode, - sizeof(TVCrtRegs), crt, sizeof(TVRegs), tv); - if (mode) { - mode->crt = crt; - mode->tv = tv; - } - return (n >= 1); -} - -void bcl_initSharedView (int *view_x, int *view_y) -{ - DPRINTF ("bcl_initSharedView\n"); - pipeWriteCmd (pipe_out, PCmd_InitSharedView); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 2, sizeof(int), view_x, sizeof(int), view_y); -} - -Bool bcl_getTwinView (int *view_x, int *view_y) -{ - Bool result; - - DPRINTF ("bcl_getTwinVie\n"); - pipeWriteCmd (pipe_out, PCmd_GetTwinView); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 3, sizeof(Bool), &result, - sizeof(int), view_x, sizeof(int), view_y); - return result; -} - -Bool bcl_adjustViewport (int flags, int *view_x, int *view_y) -{ - Bool result; - - DPRINTF ("bcl_adjustViewport\n"); - pipeWriteCmd (pipe_out, PCmd_AdjustView); - pipeWriteArgs (pipe_out, 3, sizeof(int), &flags, - sizeof(int), view_x, sizeof(int), view_y); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_out, 3, sizeof(int), &result, - sizeof(int), view_x, sizeof(int), view_y); - return result; -} - -Bool bcl_serviceViewportCursor (int flags, int cursor_x, int cursor_y, - int *view_x, int *view_y) -{ - Bool result; - - DPRINTF ("bcl_serviceViewportCursor\n"); - pipeWriteCmd (pipe_out, PCmd_ServiceVC); - pipeWriteArgs (pipe_out, 5, sizeof(int), &flags, - sizeof(int), &cursor_x, sizeof(int), &cursor_y, - sizeof(int), view_x, sizeof(int), view_y); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_out, 3, sizeof(int), &result, - sizeof(int), view_x, sizeof(int), view_y); - return result; -} - -#if __GNUC__ -BackAccessRec bcl_access_func = { - openCard: bcl_openCard, - closeCard: bcl_closeCard, -#ifdef DEBUG_PROBE - probeSystem: bnull_probeSystem, -#endif -}; - -BackCardRec bcl_card_func = { - openCard: bcl_openCard, - closeCard: bcl_closeCard, -#ifdef DEBUG_PROBE - probeCard: bnull_probeCard, - probeBus: bnull_probeBus, -#endif - setHeads: bcl_setHeads, - getHeads: bcl_getHeads, - probeChips: bcl_probeChips, - setChip: bcl_setChip, - setSettings: bcl_setSettings, - getSettings: bcl_getSettings, - setMode: bcl_setMode, - getMode: bcl_getMode, - setModeSettings: bcl_setModeSettings, - setTestImage: bcl_setTestImage, - getStatus: bcl_getStatus, - getConnection: bcl_getConnection, - findBySize: bcl_findBySize, - findByOverscan: bcl_findByOverscan, - initSharedView: bcl_initSharedView, - getTwinView: bcl_getTwinView, - adjustViewport: bcl_adjustViewport, - serviceViewportCursor: bcl_serviceViewportCursor, -}; -#else -BackAccessRec bcl_access_func = { - bcl_openCard, - bcl_closeCard, -#ifdef DEBUG_PROBE - bnull_probeSystem, -#endif -}; - -BackCardRec bcl_card_func = { - bcl_openCard, - bcl_closeCard, - bcl_probeChips, -#ifdef DEBUG_PROBE - bnull_probeCard, - bnull_probeBus, -#endif - bcl_setHeads, - bcl_getHeads, - bcl_setChip, - bcl_setSettings, - bcl_getSettings, - bcl_setMode, - bcl_getMode, - bcl_setModeSettings, - bcl_setTestImage, - bcl_getStatus, - bcl_getConnection, - bcl_findBySize, - bcl_findByOverscan, - bcl_initSharedView, - bcl_getTwinView, - bcl_adjustViewport, - bcl_serviceViewportCursor, -}; -#endif - -/* -------- Init -------- */ - -Bool back_client_avail (void) -{ - int version; - int fd_out, fd_in; - - /* IMPORTANT: Open out pipe first, otherwise deadlock */ - fd_out = open (PIPE_OUT, O_WRONLY | O_NONBLOCK); - if (fd_out < 0) return FALSE; - fd_in = open (PIPE_IN, O_RDONLY | O_NONBLOCK); - if (fd_in < 0) { - close (fd_out); - return FALSE; - } - close (fd_in); - close (fd_out); - bcl_openPipes (); - if (!pipe_in || !pipe_out) { - /* FIXME: error message */ - bcl_closePipes (); - return FALSE; - } - pipeWriteCmd (pipe_out, PCmd_Version); - pipeWriteArgs (pipe_out, 0); - pipeReadCmd (pipe_in); - pipeReadArgs (pipe_in, 1, sizeof(version), &version); - bcl_closePipes (); - return (version == PIPE_VERSION); -} - - -CardPtr back_client_init (void) -{ - CardPtr card; - - back_access = &bcl_access_func; - back_card = &bcl_card_func; - bcl_openPipes (); - pipeWriteCmd (pipe_out, PCmd_Init); - pipeWriteArgs (pipe_out, 0); - bcl_root = pipeReadList (pipe_in, sizeof (CardInfo)); - bcl_card = bcl_root; - bcl_closePipes (); - for (card = bcl_card; card; card = card->next) { - card->chips = NULL; - card->dev = NULL; - } - return bcl_root; -} - -/* NVTV pipe -- Dirk Thierbach <dthierbach@gmx.de> - * - * This file is part of nvtv, a tool for tv-output on NVidia cards. - * - * nvtv is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * nvtv 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 General Public License for more details. - * - * You should have received a copy of the GNU 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 - * - * $Id: nvtvd.c,v 1.3 2002/10/23 17:12:32 guenter Exp $ - * - * Contents: - * - * Routines to access the named pipe for server/client communication - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <stdarg.h> - -/* - * Read a command from a pipe - */ - -PipeCmd pipeReadCmd (FILE *pipe) -{ - PipeCmd cmd; - - DPRINTF ("pipe read cmd\n"); - fread (&cmd, sizeof(PipeCmd), 1, pipe); - DPRINTF ("pipe read cmd, got %i\n", cmd); - return cmd; -} - -/* - * Write a command to a pipe - */ - -void pipeWriteCmd (FILE *pipe, PipeCmd cmd) -{ - DPRINTF ("pipe write cmd %i\n", cmd); - fwrite (&cmd, sizeof(PipeCmd), 1, pipe); - fflush (pipe); - DPRINTF ("pipe write cmd done\n"); -} - -/* - * Write arguments to a pipe. Ellipsis paramaters are: - * size1, pointer1, size2, pointer2, ..., 0 - * Ignore zero size of null pointer arguments. - */ - -void pipeWriteArgs (FILE *pipe, int n, ...) -{ - va_list ap; - int i, s; - void *p; - - DPRINTF ("pipe write args\n"); - fwrite (&n, sizeof(n), 1, pipe); - va_start(ap, n); - for (i = 0; i < n; i++) { - s = va_arg(ap, int); - p = va_arg(ap, void *); - if (!p) s = 0; - fwrite (&s, sizeof(s), 1, pipe); - if (s != 0) { - fwrite (p, s, 1, pipe); - } - } - fflush (pipe); - va_end(ap); -} - -/* - * Implements the three following read routines. Allocate elements - * with zero size, and optionally set results. - */ - -int pipeReadArgsMulti (FILE *pipe, int res, int n, va_list ap) -{ - int i, j; - int m, s, t, r; - void *p; - void **q; - int ok; - - r = 0; - fread (&m, sizeof(m), 1, pipe); - ok = (m == n); - for (i = 0; i < m; i++) { - fread (&t, sizeof(t), 1, pipe); - s = va_arg(ap, int); - p = va_arg(ap, void *); - if (ok) { - if (s != 0 && t != 0 && s != t) ok = 0; - } - if (ok) { - r++; - } else { - p = NULL; - } - if (t == 0) p = NULL; - if (s == 0 && p) { /* alloc zero size */ - q = (void **) p; - p = malloc (t); - *q = p; - } - if (res) { /* store result pointer */ - q = va_arg(ap, void **); - if (q) *q = p; - } - if (p) { - fread (p, t, 1, pipe); - } else { - for (j = 0; j < t; j++) fgetc (pipe); - } - } - return r; -} - -/* - * Read arguments from a pipe. Ellipsis parameters are: - * size_1, pointer_1, size_2, pointer_2, ..., size_n, pointer_n - * Ignore null pointer arguments, and allocate arguments with zero size. - * Return number of initial arguments that matched input stream. - */ - -int pipeReadArgs (FILE *pipe, int n, ...) -{ - va_list ap; - int r; - - DPRINTF ("pipe read args\n"); - va_start(ap, n); - r = pipeReadArgsMulti (pipe, 0, n, ap); - va_end(ap); - return r; -} - -/* - * Read optional arguments from a pipe. Ellipsis parameters are: - * size_1, pointer_1, result_1, ..., size_n, pointer_n, result_n - * Ignore zero size or null pointer arguments. Return number of - * initial arguments that matched input stream, and set each result - * either to NULL or to pointer. - */ - -int pipeReadArgsOpt (FILE *pipe, int n, ...) -{ - va_list ap; - int r; - - DPRINTF ("pipe read args opt\n"); - va_start(ap, n); - r = pipeReadArgsMulti (pipe, 1, n, ap); - va_end(ap); - return r; -} - -/* - * Read list from a pipe, alloc elements, and return pointer to first - * element. The elements MUST contain the next field as first entry, - * and a string as second entry. - */ - -void* pipeReadList (FILE *pipe, int size) -{ - void *root, *p, *q; - int i, j, n, t; - char *s; - - DPRINTF ("pipe read list\n"); - root = p = NULL; - fread (&n, sizeof(n), 1, pipe); - n /= 2; - for (i = 0; i < n; i++) { - fread (&t, sizeof(t), 1, pipe); - if (t == size) { - q = malloc (t); - fread (q, t, 1, pipe); - if (p) { - * (void **) p = q; - } else { - root = q; - } - p = q; - } else { - q = NULL; - for (j = 0; j < t; j++) fgetc (pipe); - } - fread (&t, sizeof(t), 1, pipe); - if (q) { - s = NULL; - if (t != 0) { - s = malloc (t); - fread (s, sizeof(char), t, pipe); - } - * (((char **) q) + 1) = s; - } else { - for (j = 0; j < t; j++) fgetc (pipe); - } - } - return root; -} - -/* - * Write list to a pipe. The elements MUST contain the next field as - * first entry, and a string as second entry. - */ - -void pipeWriteList (FILE *pipe, int size, void *list) -{ - void *l; - char *s; - int n, k; - - DPRINTF ("pipe write list\n"); - n = 0; - for (l = list; l; l = * (void **) l) n++; - n *= 2; - fwrite (&n, sizeof(n), 1, pipe); - for (l = list; l; l = * (void **) l) { - fwrite (&size, sizeof(size), 1, pipe); - fwrite (l, size, 1, pipe); - s = * (((char **) l) + 1); - if (s) { - k = strlen(s) + 1; - fwrite (&k, sizeof(k), 1, pipe); - fwrite (s, sizeof(char), k, pipe); - } else { - k = 0; - fwrite (&k, sizeof(k), 1, pipe); - } - } - fflush (pipe); -} - |