+#define PERLIO_NOT_STDIO 0
#include <libc/stubs.h>
#include <io.h>
#include <errno.h>
static struct pipe_list *pl = NULL;
FILE *
-popen (const char *cm, const char *md) /* program name, pipe mode */
+djgpp_popen (const char *cm, const char *md) /* program name, pipe mode */
{
struct pipe_list *l1;
int fd;
}
int
-pclose (FILE *pp)
+djgpp_pclose (FILE *pp)
{
struct pipe_list *l1, **l2; /* list pointers */
int retval=-1; /* function return value */
#define EXECF_EXEC 1
static int
-convretcode (int rc,char *prog,int fl)
+convretcode (pTHX_ int rc,char *prog,int fl)
{
- if (rc < 0 && dowarn)
- warn ("Can't %s \"%s\": %s",fl ? "exec" : "spawn",prog,Strerror (errno));
- if (rc > 0)
- return rc <<= 8;
- if (rc < 0)
- return 255 << 8;
- return 0;
+ if (rc < 0 && ckWARN(WARN_EXEC))
+ Perl_warner(aTHX_ WARN_EXEC,"Can't %s \"%s\": %s",
+ fl ? "exec" : "spawn",prog,Strerror (errno));
+ if (rc >= 0)
+ return rc << 8;
+ return -1;
}
int
-do_aspawn (SV *really,SV **mark,SV **sp)
+do_aspawn (pTHX_ SV *really,SV **mark,SV **sp)
{
- dTHR;
int rc;
char **a,*tmps,**argv;
+ STRLEN n_a;
if (sp<=mark)
return -1;
while (++mark <= sp)
if (*mark)
- *a++ = SvPVx(*mark, na);
+ *a++ = SvPVx(*mark, n_a);
else
*a++ = "";
*a = Nullch;
) /* will swawnvp use PATH? */
TAINT_ENV(); /* testing IFS here is overkill, probably */
- if (really && *(tmps = SvPV(really, na)))
+ if (really && *(tmps = SvPV(really, n_a)))
rc=spawnvp (P_WAIT,tmps,argv);
else
rc=spawnvp (P_WAIT,argv[0],argv);
#define EXTRA "\x00\x00\x00\x00\x00\x00"
int
-do_spawn2 (char *cmd,int execf)
+do_spawn2 (pTHX_ char *cmd,int execf)
{
char **a,*s,*shell,*metachars;
int rc,unixysh;
return convretcode (system (cmd),cmd,execf);
}
- New (1303,Argv,(s-cmd)/2+2,char*);
- Cmd=savepvn (cmd,s-cmd);
- a=Argv;
- for (s=Cmd; *s;) {
+ New (1303,PL_Argv,(s-cmd)/2+2,char*);
+ PL_Cmd=savepvn (cmd,s-cmd);
+ a=PL_Argv;
+ for (s=PL_Cmd; *s;) {
while (*s && isSPACE (*s)) s++;
if (*s)
*(a++)=s;
*s++='\0';
}
*a=Nullch;
- if (!Argv[0])
+ if (!PL_Argv[0])
return -1;
if (execf==EXECF_EXEC)
- rc=execvp (Argv[0],Argv);
+ rc=execvp (PL_Argv[0],PL_Argv);
else
- rc=spawnvp (P_WAIT,Argv[0],Argv);
- return convretcode (rc,Argv[0],execf);
+ rc=spawnvp (P_WAIT,PL_Argv[0],PL_Argv);
+ return convretcode (rc,PL_Argv[0],execf);
}
int
-do_spawn (char *cmd)
+do_spawn (pTHX_ char *cmd)
{
- return do_spawn2 (cmd,EXECF_SPAWN);
+ return do_spawn2 (aTHX_ cmd,EXECF_SPAWN);
}
bool
-do_exec (char *cmd)
+Perl_do_exec (pTHX_ char *cmd)
{
- do_spawn2 (cmd,EXECF_EXEC);
+ do_spawn2 (aTHX_ cmd,EXECF_EXEC);
return FALSE;
}
int fd;
char *matches;
size_t size;
+ fpos_t pos;
};
#define MAXOPENGLOBS 10
if ((gi=searchfd (-1)) == NULL)
break;
+ gi->pos=0;
pattern=alloca (strlen (name+=13)+1);
strcpy (pattern,name);
if (!_USE_LFN)
if ((gi=searchfd (fd))==NULL)
break;
- ic=tell (fd);
- if (siz+ic>=gi->size)
- siz=gi->size-ic;
- memcpy (buf,ic+gi->matches,siz);
- lseek (fd,siz,1);
+ if (siz+gi->pos > gi->size)
+ siz = gi->size - gi->pos;
+ memcpy (buf,gi->pos+gi->matches,siz);
+ gi->pos += siz;
*rv=siz;
return 1;
}
dXSARGS;
if (items)
- croak ("Usage: Dos::GetCwd()");
+ Perl_croak (aTHX_ "Usage: Dos::GetCwd()");
{
char tmp[PATH_MAX+2];
ST(0)=sv_newmortal ();
}
void
-init_os_extras()
+Perl_init_os_extras(pTHX)
{
char *file = __FILE__;
strcpy (perlprefix,"..");
}
+int
+djgpp_fflush (FILE *fp)
+{
+ int res;
+
+ if ((res = fflush(fp)) == 0 && fp) {
+ Stat_t s;
+ if (Fstat(fileno(fp), &s) == 0 && !S_ISSOCK(s.st_mode))
+ res = fsync(fileno(fp));
+ }
+/*
+ * If the flush succeeded but set end-of-file, we need to clear
+ * the error because our caller may check ferror(). BTW, this
+ * probably means we just flushed an empty file.
+ */
+ if (res == 0 && fp && ferror(fp) == EOF) clearerr(fp);
+
+ return res;
+}