summaryrefslogtreecommitdiffstats
path: root/lib/libftp/Ftpfopen.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libftp/Ftpfopen.c')
-rw-r--r--lib/libftp/Ftpfopen.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/libftp/Ftpfopen.c b/lib/libftp/Ftpfopen.c
new file mode 100644
index 0000000..9b89bb3
--- /dev/null
+++ b/lib/libftp/Ftpfopen.c
@@ -0,0 +1,98 @@
+/*
+ Library for ftpd clients.(libftp)
+ Copyright by Oleg Orel
+ All rights reserved.
+
+This library is desined for free, non-commercial software creation.
+It is changeable and can be improved. The author would greatly appreciate
+any advises, new components and patches of the existing programs.
+Commercial usage is also possible with participation of it's author.
+
+
+
+*/
+
+#include <FtpLibrary.h>
+
+#define NFSD 256
+
+static int fds_types[NFDS];
+static int init=0;
+
+enum {T_EMPTY=0,T_FILE,T_STREAM,T_PIPE,T_FULL};
+
+FILE *Ftpfopen(char *filename,char *mode)
+{
+ FILE *fp;
+
+ if (!init)
+ {
+ bzero(fds_types,NFDS*sizeof(fds_types[0]));
+ init=1;
+ }
+
+ if (!strcmp(filename,"*STDIN*") || (!strcmp(filename,"-") && (mode[0]=='r')) )
+ {
+ fds_types[fileno(stdin)]=T_STREAM;
+ return stdin;
+ }
+
+ if (!strcmp(filename,"*STDOUT*") || (!strcmp(filename,"-") && (mode[0]=='w')))
+ {
+ fds_types[fileno(stdout)]=T_STREAM;
+ return stdout;
+ }
+
+ if (strcmp(filename,"*STDERR*")==0)
+ {
+ fds_types[fileno(stderr)]=T_STREAM;
+ return stderr;
+ }
+
+
+
+ if (*filename=='|')
+ {
+ fp=popen(filename+1,mode);
+ if (fp==NULL) return fp;
+ fds_types[fileno(fp)]=T_PIPE;
+ return fp;
+ }
+
+ fp=FtpFullOpen(filename,mode);
+ if (fp==NULL) return fp;
+ fds_types[fileno(fp)]=T_FILE;
+ return fp;
+
+}
+
+int Ftpfclose(FILE *fp)
+{
+
+ if (!init)
+ {
+ bzero(fds_types,NFDS*sizeof(fds_types[0]));
+ init=1;
+ }
+
+ switch (fds_types[fileno(fp)])
+ {
+
+ case T_FILE:
+
+ return FtpFullClose(fp);
+
+ case T_STREAM:
+
+ return fflush(fp);
+
+ case T_PIPE:
+
+ return pclose(fp);
+
+ default:
+
+ return -1;
+ }
+
+}
OpenPOWER on IntegriCloud