int DLL_DECL dpm_ping(char *host, char *info) { int c; char func[16]; gid_t gid; int msglen; char *q; char *rbp; char repbuf[256]; char *sbp; char sendbuf[REQBUFSZ]; struct dpm_api_thread_info *thip; uid_t uid; strcpy (func, "dpm_ping"); if (dpm_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { dpm_errmsg (func, DP053); serrno = SENOMAPFND; return (-1); } #endif if (! info) { serrno = EFAULT; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, DPM_MAGIC); marshall_LONG (sbp, DPM_PING); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2dpm (host, sendbuf, msglen, repbuf, sizeof(repbuf), NULL, NULL); if (c == 0) { rbp = repbuf; unmarshall_STRING (rbp, info); } return (c); }
int DLL_DECL Cns_getgrpbygid(gid_t gid, char *groupname) { int c; char func[16]; int msglen; char *q; char *rbp; char repbuf[256]; char *sbp; char sendbuf[REQBUFSZ]; struct Cns_api_thread_info *thip; strcpy (func, "Cns_getgrpbygid"); if (Cns_apiinit (&thip)) return (-1); if (! groupname) { serrno = EFAULT; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_GETGRPNAM); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, gid); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c == 0) { rbp = repbuf; unmarshall_STRING (rbp, groupname); } return (c); }
struct Cns_direnrep DLL_DECL * Cns_readdirxr(Cns_DIR *dirp, char *se) { int c; int direntsz; struct Cns_direnrep *dp; char func[16]; int getattr = 5; gid_t gid; int i; struct Cns_rep_info *ir; int msglen; int n; int nbentries; char *q; char *rbp; struct Cns_rep_info *rep_entries; char repbuf[DIRBUFSZ+4]; char *sbp; char sendbuf[REQBUFSZ]; uid_t uid; strcpy (func, "Cns_readdirxr"); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (NULL); } #endif if (! dirp) { serrno = EFAULT; return (NULL); } if (se && strlen (se) > CA_MAXHOSTNAMELEN) { serrno = EINVAL; return (NULL); } /* compute size of client machine Cns_direnrep structure excluding d_name */ dp = (struct Cns_direnrep *) dirp->dd_buf; direntsz = &dp->d_name[0] - (char *) dp; if (dirp->dd_size == 0) { /* no data in the cache */ if (dirp->replicas) { /* free previous replica information */ ir = (struct Cns_rep_info *) dirp->replicas; for (i = 0; i < dirp->nbreplicas; i++) { free (ir->host); free (ir->sfn); ir++; } free (dirp->replicas); dirp->nbreplicas = 0; dirp->replicas = NULL; } if (dirp->eod) return (NULL); /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_READDIR); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_WORD (sbp, getattr); marshall_WORD (sbp, direntsz); marshall_HYPER (sbp, dirp->fileid); marshall_WORD (sbp, dirp->bod); if (se) { marshall_STRING (sbp, se); } else { marshall_STRING (sbp, ""); } msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsdx (&dirp->dd_fd, NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **) &dirp->replicas, &dirp->nbreplicas); if (c < 0) return (NULL); rbp = repbuf; unmarshall_WORD (rbp, nbentries); if (nbentries == 0) return (NULL); /* end of directory */ /* unmarshall reply into the Cns_direnrep structures */ dp = (struct Cns_direnrep *) dirp->dd_buf; i = 0; rep_entries = (struct Cns_rep_info *) dirp->replicas; while (nbentries--) { unmarshall_HYPER (rbp, dp->fileid); unmarshall_STRING (rbp, dp->guid); unmarshall_WORD (rbp, dp->filemode); unmarshall_HYPER (rbp, dp->filesize); dp->nbreplicas = 0; dp->rep = NULL; for ( ; i < dirp->nbreplicas; i++) { if (dp->fileid != (rep_entries+i)->fileid) break; dp->nbreplicas++; if (dp->nbreplicas == 1) dp->rep = rep_entries + i; } unmarshall_STRING (rbp, dp->d_name); dp->d_reclen = ((direntsz + strlen (dp->d_name) + 8) / 8) * 8; dp = (struct Cns_direnrep *) ((char *) dp + dp->d_reclen); } dirp->bod = 0; unmarshall_WORD (rbp, dirp->eod); dirp->dd_size = (char *) dp - dirp->dd_buf; } dp = (struct Cns_direnrep *) (dirp->dd_buf + dirp->dd_loc); dirp->dd_loc += dp->d_reclen; if (dirp->dd_loc >= dirp->dd_size) { /* must refill next time */ dirp->dd_loc = 0; dirp->dd_size = 0; } return (dp); }
int DLL_DECL dpm_put (int nbreqfiles, struct dpm_putfilereq *reqfiles, int nbprotocols, char **protocols, char *u_token, int overwrite, time_t retrytime, char *r_token, int *nbreplies, struct dpm_putfilestatus **filestatuses) { int c; char errstring[256]; char func[16]; gid_t gid; int i; int msglen; char *rbp; char repbuf[4+256+CA_MAXDPMTOKENLEN+1]; char *sbp; char *sendbuf; char surl[CA_MAXSFNLEN+1]; struct dpm_api_thread_info *thip; uid_t uid; strcpy (func, "dpm_put"); if (dpm_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { dpm_errmsg (func, DP053); serrno = SENOMAPFND; return (-1); } #endif if (nbreqfiles <= 0 || nbprotocols <= 0) { serrno = EINVAL; return (-1); } if (! reqfiles || ! protocols || ! r_token || ! nbreplies || ! filestatuses) { serrno = EFAULT; return (-1); } /* Compute size of send buffer */ msglen = 6 * LONGSIZE; for (i = 0; i < nbprotocols; i++) msglen += strlen (protocols[i]) + 1; if (u_token) msglen += strlen (u_token) + 1; else msglen++; msglen += LONGSIZE; msglen += TIME_TSIZE; msglen += LONGSIZE; for (i = 0; i < nbreqfiles; i++) { msglen += strlen ((reqfiles+i)->to_surl) + 1; msglen += TIME_TSIZE; msglen++; msglen += strlen ((reqfiles+i)->s_token) + 1; msglen += HYPERSIZE; msglen += TIME_TSIZE; msglen++; msglen++; } /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, DPM_MAGIC2); marshall_LONG (sbp, DPM_PUT); marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_LONG (sbp, nbprotocols); for (i = 0; i < nbprotocols; i++) marshall_STRING (sbp, protocols[i]); if (u_token) { marshall_STRING (sbp, u_token); } else { marshall_STRING (sbp, ""); } marshall_LONG (sbp, overwrite); marshall_TIME_T (sbp, retrytime); marshall_LONG (sbp, nbreqfiles); for (i = 0; i < nbreqfiles; i++) { marshall_STRING (sbp, (reqfiles+i)->to_surl); marshall_TIME_T (sbp, (reqfiles+i)->lifetime); marshall_BYTE (sbp, (reqfiles+i)->f_type); marshall_STRING (sbp, (reqfiles+i)->s_token); marshall_HYPER (sbp, (reqfiles+i)->requested_size); marshall_TIME_T (sbp, (reqfiles+i)->f_lifetime); marshall_BYTE (sbp, (reqfiles+i)->ret_policy); marshall_BYTE (sbp, (reqfiles+i)->ac_latency); } c = send2dpm (NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **)filestatuses, nbreplies); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, c); if ((c & 0xF000) == DPM_FAILED) { serrno = c - DPM_FAILED; c = -1; } unmarshall_STRING (rbp, errstring); if (*errstring) dpm_errmsg (func, "%s\n", errstring); unmarshall_STRING (rbp, r_token); } return (c); }
int DLL_DECL dpm_getreqsummary (int nbtokens, char **r_tokens, int *nbreplies, struct dpm_reqsummary **summaries) { int c; char errstring[256]; char func[18]; gid_t gid; int i; int msglen; char *rbp; char repbuf[4+256]; char *sbp; char *sendbuf; struct dpm_api_thread_info *thip; uid_t uid; strcpy (func, "dpm_getreqsummary"); if (dpm_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { dpm_errmsg (func, DP053); serrno = SENOMAPFND; return (-1); } #endif if (nbtokens <= 0) { serrno = EINVAL; return (-1); } if (! r_tokens || ! nbreplies || ! summaries) { serrno = EFAULT; return (-1); } /* Compute size of send buffer */ msglen = 6 * LONGSIZE; for (i = 0; i < nbtokens; i++) { msglen += strlen (r_tokens[i]) + 1; } /* Allocate send buffer */ if ((sendbuf = malloc (msglen)) == NULL) { serrno = ENOMEM; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, DPM_MAGIC); marshall_LONG (sbp, DPM_GETREQSUM); marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_LONG (sbp, nbtokens); for (i = 0; i < nbtokens; i++) { marshall_STRING (sbp, r_tokens[i]); } c = send2dpm (NULL, sendbuf, msglen, repbuf, sizeof(repbuf), (void **)summaries, nbreplies); free (sendbuf); if (c == 0) { rbp = repbuf; unmarshall_LONG (rbp, c); if (c) { serrno = c - DPM_FAILED; c = -1; } unmarshall_STRING (rbp, errstring); if (*errstring) dpm_errmsg (func, "%s\n", errstring); } return (c); }
int DLL_DECL Cns_statr(const char *sfn, struct Cns_filestatg *statbuf) { int c, n; char func[16]; gid_t gid; int msglen; char *q; char *rbp; char repbuf[132]; char *sbp; char sendbuf[REQBUFSZ]; struct Cns_api_thread_info *thip; uid_t uid; strcpy (func, "Cns_statr"); if (Cns_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (-1); } #endif if (! sfn || ! statbuf) { serrno = EFAULT; return (-1); } if (strlen (sfn) > CA_MAXSFNLEN) { serrno = ENAMETOOLONG; return (-1); } /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_STATR); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_STRING (sbp, sfn); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c == 0) { rbp = repbuf; unmarshall_HYPER (rbp, statbuf->fileid); unmarshall_STRING (rbp, statbuf->guid); unmarshall_WORD (rbp, statbuf->filemode); unmarshall_LONG (rbp, statbuf->nlink); unmarshall_LONG (rbp, statbuf->uid); unmarshall_LONG (rbp, statbuf->gid); unmarshall_HYPER (rbp, statbuf->filesize); unmarshall_TIME_T (rbp, statbuf->atime); unmarshall_TIME_T (rbp, statbuf->mtime); unmarshall_TIME_T (rbp, statbuf->ctime); unmarshall_WORD (rbp, statbuf->fileclass); unmarshall_BYTE (rbp, statbuf->status); unmarshall_STRING (rbp, statbuf->csumtype); unmarshall_STRING (rbp, statbuf->csumvalue); } if (c && serrno == SENAMETOOLONG) serrno = ENAMETOOLONG; return (c); }
int DLL_DECL Cns_statg(const char *path, const char *guid, struct Cns_filestatg *statbuf) { char *actual_path; int c, n; char func[16]; gid_t gid; int msglen; char *q; char *rbp; char repbuf[130]; char *sbp; char sendbuf[REQBUFSZ]; char server[CA_MAXHOSTNAMELEN+1]; struct Cns_api_thread_info *thip; uid_t uid; strcpy (func, "Cns_statg"); if (Cns_apiinit (&thip)) return (-1); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (-1); } #endif if ((! path && ! guid) || ! statbuf) { serrno = EFAULT; return (-1); } if (path && strlen (path) > CA_MAXPATHLEN) { serrno = ENAMETOOLONG; return (-1); } if (guid && strlen (guid) > CA_MAXGUIDLEN) { serrno = EINVAL; return (-1); } if (path && Cns_selectsrvr (path, thip->server, server, &actual_path)) return (-1); /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); marshall_LONG (sbp, CNS_STATG); q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_HYPER (sbp, thip->cwd); if (path) { marshall_STRING (sbp, actual_path); } else { marshall_STRING (sbp, ""); } if (guid) { marshall_STRING (sbp, guid); } else { marshall_STRING (sbp, ""); } msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (NULL, path ? server : NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c == 0) { rbp = repbuf; unmarshall_HYPER (rbp, statbuf->fileid); unmarshall_STRING (rbp, statbuf->guid); unmarshall_WORD (rbp, statbuf->filemode); unmarshall_LONG (rbp, statbuf->nlink); unmarshall_LONG (rbp, statbuf->uid); unmarshall_LONG (rbp, statbuf->gid); unmarshall_HYPER (rbp, statbuf->filesize); unmarshall_TIME_T (rbp, statbuf->atime); unmarshall_TIME_T (rbp, statbuf->mtime); unmarshall_TIME_T (rbp, statbuf->ctime); unmarshall_WORD (rbp, statbuf->fileclass); unmarshall_BYTE (rbp, statbuf->status); unmarshall_STRING (rbp, statbuf->csumtype); unmarshall_STRING (rbp, statbuf->csumvalue); } if (c && serrno == SENAMETOOLONG) serrno = ENAMETOOLONG; return (c); }
struct Cns_linkinfo * Cns_listlinks(const char *path, const char *guid, int flags, Cns_list *listp) { char *actual_path; int bol = 0; int c; char func[16]; gid_t gid; int listentsz = sizeof(struct Cns_linkinfo); struct Cns_linkinfo *lp; int msglen; int nbentries; char *p; char *q; char *rbp; char repbuf[LISTBUFSZ+4]; char *sbp; char sendbuf[REQBUFSZ]; char server[CA_MAXHOSTNAMELEN+1]; struct Cns_api_thread_info *thip; uid_t uid; strcpy (func, "Cns_listlinks"); if (Cns_apiinit (&thip)) return (NULL); uid = geteuid(); gid = getegid(); #if defined(_WIN32) if (uid < 0 || gid < 0) { Cns_errmsg (func, NS053); serrno = SENOMAPFND; return (NULL); } #endif if ((! path && ! guid) || ! listp) { serrno = EFAULT; return (NULL); } if ((path && strlen (path) > CA_MAXPATHLEN) || (guid && strlen (guid) > CA_MAXGUIDLEN)) { serrno = ENAMETOOLONG; return (NULL); } if (path && Cns_selectsrvr (path, thip->server, server, &actual_path)) return (NULL); if (flags == CNS_LIST_BEGIN) { memset (listp, 0, sizeof(Cns_list)); listp->fd = -1; if ((listp->buf = malloc (LISTBUFSZ)) == NULL) { serrno = ENOMEM; return (NULL); } bol = 1; } if (listp->len == 0 && listp->eol /* all entries have been listed */ && flags != CNS_LIST_END) return (NULL); if (listp->buf == NULL) return (NULL); /* buffer has already been freed */ if (listp->len == 0 /* no data in the cache */ || flags == CNS_LIST_END) { /* Build request header */ sbp = sendbuf; marshall_LONG (sbp, CNS_MAGIC); if (flags == CNS_LIST_END) { marshall_LONG (sbp, CNS_ENDLIST); } else { marshall_LONG (sbp, CNS_LISTLINKS); } q = sbp; /* save pointer. The next field will be updated */ msglen = 3 * LONGSIZE; marshall_LONG (sbp, msglen); /* Build request body */ marshall_LONG (sbp, uid); marshall_LONG (sbp, gid); marshall_WORD (sbp, listentsz); marshall_HYPER (sbp, thip->cwd); if (path) { marshall_STRING (sbp, actual_path); } else { marshall_STRING (sbp, ""); } if (guid) { marshall_STRING (sbp, guid); } else { marshall_STRING (sbp, ""); } marshall_WORD (sbp, bol); msglen = sbp - sendbuf; marshall_LONG (q, msglen); /* update length field */ c = send2nsd (&listp->fd, path ? server : NULL, sendbuf, msglen, repbuf, sizeof(repbuf)); if (c < 0 || flags == CNS_LIST_END) { if (listp->buf) free (listp->buf); listp->buf = NULL; return (NULL); } rbp = repbuf; unmarshall_WORD (rbp, nbentries); if (nbentries == 0) return (NULL); /* end of list */ /* unmarshall reply into Cns_linkinfo structures */ lp = (struct Cns_linkinfo *) listp->buf; while (nbentries--) { unmarshall_STRING (rbp, lp->path); lp++; } unmarshall_WORD (rbp, listp->eol); listp->len = (char *) lp - listp->buf; } lp = (struct Cns_linkinfo *) (listp->buf + listp->offset); listp->offset += sizeof(struct Cns_linkinfo); if (listp->offset >= listp->len) { /* must refill next time */ listp->offset = 0; listp->len = 0; } return (lp); }