90 lines
2.2 KiB
C
90 lines
2.2 KiB
C
|
/*
|
||
|
* Copyright (c) 1992 by the University of Southern California
|
||
|
*
|
||
|
* For copying and distribution information, please see the file <usc-copyr.h>
|
||
|
*/
|
||
|
/* Author: Steven Augart, swa@isi.edu */
|
||
|
#include <usc-copyr.h>
|
||
|
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include <ardp.h>
|
||
|
#include <pfs.h>
|
||
|
#include <pparse.h>
|
||
|
#include <perrno.h>
|
||
|
|
||
|
static int eoi_parse_resp(RREQ resp);
|
||
|
extern int pfs_debug;
|
||
|
|
||
|
/* Returns PSUCCESS upon successful execution, PFAILURE for whatever failure
|
||
|
reason. */
|
||
|
int
|
||
|
pset_linkat(VLINK dlink, char lname[], int flags, PATTRIB attributes)
|
||
|
{
|
||
|
RREQ req;
|
||
|
OUTPUT_ST out_st;
|
||
|
OUTPUT out = &out_st;
|
||
|
int tmp;
|
||
|
|
||
|
req = p__start_req(dlink->host);
|
||
|
p__add_req(req, "DIRECTORY ASCII %'s 0\nEDIT-LINK-INFO ", dlink->hsoname);
|
||
|
switch(flags) {
|
||
|
case EOI_ADD:
|
||
|
p__add_req(req, "ADD");
|
||
|
break;
|
||
|
case EOI_DELETE:
|
||
|
p__add_req(req, "DELETE");
|
||
|
break;
|
||
|
case EOI_DELETE_ALL:
|
||
|
p__add_req(req, "DELETE-ALL");
|
||
|
break;
|
||
|
case EOI_REPLACE:
|
||
|
p__add_req(req, "REPLACE");
|
||
|
break;
|
||
|
default:
|
||
|
p_err_string = qsprintf_stcopyr(p_err_string,
|
||
|
"edit_object_info(): Illegal flag value: %d", flags);
|
||
|
break;
|
||
|
RETURNPFAILURE;
|
||
|
}
|
||
|
p__add_req(req, " %'s\n", lname);
|
||
|
requesttoout(req,out);
|
||
|
out_atrs(out, attributes, 0);
|
||
|
tmp = ardp_send(req, dlink->host, 0, ARDP_WAIT_TILL_TO);
|
||
|
if(tmp) {
|
||
|
fprintf(stderr,"Dirsend failed: %d\n",perrno);
|
||
|
perrno = tmp;
|
||
|
}
|
||
|
|
||
|
if(req->rcvd == NULL) return(perrno);
|
||
|
|
||
|
return eoi_parse_resp(req);
|
||
|
}
|
||
|
|
||
|
static int
|
||
|
eoi_parse_resp(RREQ resp)
|
||
|
{
|
||
|
INPUT_ST in_st;
|
||
|
INPUT in = &in_st;
|
||
|
|
||
|
rreqtoin(resp, in);
|
||
|
|
||
|
while(!in_eof(in)) {
|
||
|
char *line;
|
||
|
char *next_word;
|
||
|
int tmp; /* error return code from functions */
|
||
|
|
||
|
if (tmp = in_line(in, &line, &next_word)) {
|
||
|
ardp_rqfree(resp);
|
||
|
return(tmp);
|
||
|
}
|
||
|
/* Scanerr() will handle SUCCESS or FAILURE or any other error return
|
||
|
codes. It parses it all for us! */
|
||
|
if (tmp = scan_error(line, resp)) {
|
||
|
ardp_rqfree(resp);
|
||
|
return tmp;
|
||
|
}
|
||
|
}
|
||
|
return PSUCCESS;
|
||
|
}
|