|
发表于 2005-4-9 09:23:05
|
显示全部楼层
Post by dancingpig
[PHP]
int
QueryDir (char *outfile, char fetchType, char *outfilename)
{
struct sockaddr_in da;
int foo;
int hh;
int rc;
int i, s, ns;
int Port;
FILE *in, *out;
char *ptr;
da = sa;
da.sin_addr.s_addr = myaddr.addr;
da.sin_port = 0;
s = socket (AF_INET, SOCK_STREAM, 0);
if (s < 0)
{
perror ("socket");
return (S_ERROR);
}
foo = sizeof (da);
while (bind (s, (struct sockaddr *) &da, foo) < 0)
{
perror ("bind");
return (S_ERROR);
}
if (getsockname (s, (struct sockaddr *) &da, &foo) < 0)
{
perror ("ftp: getsockname");
return (S_ERROR);
}
Port = ntohs (da.sin_port);
if (listen (s, 1) < 0)
{
perror ("listen");
return (S_ERROR);
}
fprintf (CtlOut, " ORT %u,%u,%u,%u,%u,%u\r\n",
(unsigned char) myaddr.bytes[0],
(unsigned char) myaddr.bytes[1],
(unsigned char) myaddr.bytes[2],
(unsigned char) myaddr.bytes[3], Port / 256,
Port - (unsigned int) (Port / 256) * 256);
if ((rc = WaitReply ()) == S_OK)
{
switch (fetchType)
{
case 0:
fprintf (CtlOut, "LIST\r\n");
break;
case 1:
fprintf (CtlOut, "LIST -lR\r\n");
break;
case 2:
fprintf (CtlOut, "TYPE I\r\n");
WaitReply ();
fprintf (CtlOut, "RETR %s\r\n", outfilename);
//命令:> RETR [dmhy][nadesico][001][jap_chn][500k].rmvb
break;
default:
puts ("Wrong kind of `fetchType' argument in QueryDir");
return (S_ERROR);
}
if (WaitReply () != S_PREOK)
return (S_ERROR_INFIMA);
if ((hh = creat (outfile, MODE)) == -1)
return (S_ERROR);
foo = sizeof da;
ns = accept (s, (struct sockaddr *) &da, &foo);
if (ns < 0)
{
perror ("accept");
return (S_ERROR);
}
close (s);
if (fetchType == 2)
while (1)
{
i = read (ns, Line, MAX);
if (!i)
break;
alarm (TIMEOUT);
write (hh, Line, i);
}
else
{
if (!(in = fdopen (ns, "r")))
{
perror ("fdopen in here");
exit (0);
return (S_ERROR);
}
if (!(out = fdopen (hh, "w")))
{
perror ("fdopen out");
return (S_ERROR);
}
while (1)
{
fgets (Line, MAX, in);
if (feof (in))
break;
if ((ptr = strchr (Line, CR)) != NULL)
*ptr = '\0';
if ((ptr = strchr (Line, LF)) != NULL)
*ptr = '\0';
fprintf (out, "%s\n", Line);
alarm (TIMEOUT);
}
fclose (out);
fclose (in);
}
DEB ("Done with fetching the directory");
close (ns);
close (hh);
rc = WaitSucc ();
}
return (rc);
}
[/PHP]
这里我把creat换成open,open的flag是读写和创建
碰到很奇怪问题,这里创建成功没返回错误,但是写入的文件不存在。。。。
有什么办法能在文件写完后知道这个文件是否创建成功?在open下?
open 这样用好像没问题啊,
perror呢? |
|