XRootD
Loading...
Searching...
No Matches
XrdSecsssAdmin.cc File Reference
#include <cctype>
#include <iostream>
#include <limits.h>
#include <cstdlib>
#include <cstdio>
#include <fcntl.h>
#include <ctime>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "XrdOuc/XrdOucErrInfo.hh"
#include "XrdSys/XrdSysE2T.hh"
#include "XrdSys/XrdSysPlatform.hh"
#include "XrdSys/XrdSysTimer.hh"
#include "XrdSecsss/XrdSecsssKT.hh"
+ Include dependency graph for XrdSecsssAdmin.cc:

Go to the source code of this file.

Classes

struct  XrdsecsssAdmin_Opts
 

Macros

#define eMsg(x)   std::cerr <<XrdpgmName <<": " <<x << std::endl
 

Functions

time_t getXDate (const char *cDate)
 
int isNo (int dflt, const char *Msg1, const char *Msg2, const char *Msg3)
 
int main (int argc, char **argv)
 
void Usage (int rc, const char *opn, const char *opv)
 
int XrdSecsssAdmin_addKey (XrdsecsssAdmin_Opts &Opt)
 
int XrdSecsssAdmin_delKey (XrdsecsssAdmin_Opts &Opt)
 
int XrdSecsssAdmin_Here (char sType, XrdSecsssKT::ktEnt *ktX, XrdSecsssKT::ktEnt *ktS)
 
int XrdSecsssAdmin_insKey (XrdsecsssAdmin_Opts &Opt)
 
int XrdSecsssAdmin_isKey (XrdsecsssAdmin_Opts &Opt, XrdSecsssKT::ktEnt *ktP)
 
int XrdSecsssAdmin_lstKey (XrdsecsssAdmin_Opts &Opt)
 

Variables

static const char * XrdpgmName
 

Macro Definition Documentation

◆ eMsg

#define eMsg (   x)    std::cerr <<XrdpgmName <<": " <<x << std::endl

Definition at line 53 of file XrdSecsssAdmin.cc.

Function Documentation

◆ getXDate()

time_t getXDate ( const char *  cDate)

Definition at line 208 of file XrdSecsssAdmin.cc.

209{
210 struct tm myTM;
211 char *eP;
212 long theVal;
213
214// if no slashes then this is number of days
215//
216 if (!index(cDate, '/'))
217 {theVal = strtol(cDate, &eP, 10);
218 if (errno || *eP) return -1;
219 if (theVal) theVal = XrdSysTimer::Midnight() + (86400*theVal);
220 return static_cast<time_t>(theVal);
221 }
222
223// Do a date conversion
224//
225 eP = strptime(cDate, "%D", &myTM);
226 if (*eP) return -1;
227 return mktime(&myTM);
228}
static time_t Midnight(time_t tnow=0)

References XrdSysTimer::Midnight().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isNo()

int isNo ( int  dflt,
const char *  Msg1,
const char *  Msg2,
const char *  Msg3 
)

Definition at line 234 of file XrdSecsssAdmin.cc.

235{
236 char Answer[8];
237
238 std::cerr <<XrdpgmName <<": " <<Msg1 <<Msg2 <<Msg3;
239 std::cin.getline(Answer, sizeof(Answer));
240 if (!*Answer) return dflt;
241
242 if (!strcmp("y",Answer) || !strcmp("ye",Answer) || !strcmp("yes",Answer))
243 return 0;
244 return 1;
245}
static const char * XrdpgmName

References XrdpgmName.

Referenced by XrdSecsssAdmin_addKey(), and XrdSecsssAdmin_delKey().

+ Here is the caller graph for this function:

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 86 of file XrdSecsssAdmin.cc.

87{
88 extern char *optarg;
89 extern int optopt, optind, opterr;
94 extern time_t getXDate(const char *cDate);
95 extern void Usage(int rc, const char *opn=0, const char *opv=0);
96
98 enum What2Do {doAdd, doInst, doDel, doList};
99 char c, *sp;
100 const char *validOpts = "dg:h:k:l:n:s:u:x:";
101 int rc;
102 What2Do doIt = doList;
103
104// Get the name of our program
105//
106 XrdpgmName = ((sp = rindex(argv[0], '/')) ? sp+1 : argv[0]);
107
108// Process the options
109//
110 opterr = 0;
111 if (argc > 1 && '-' == *argv[1])
112 while ((c = getopt(argc,argv,validOpts))
113 && ((unsigned char)c != 0xff))
114 { switch(c)
115 {
116 case 'd': Opt.Debug = 1;
117 break;
118 case 'g': Opt.KeyGrup = optarg;
119 break;
120 case 'h': if ((Opt.Keep = atoi(optarg)) <= 0) Usage(1, "-s", optarg);
121 break;
122 case 'k': Opt.KeyName = optarg;
123 break;
124 case 'l': if ((Opt.KeyLen = atoi(optarg)) <= 0
126 Usage(1, "-l", optarg);
127 break;
128 case 'n': if ((Opt.KeyNum = atoi(optarg)) <= 0) Usage(1, "-n", optarg);
129 break;
130 case 's': if ((int)strlen(optarg) > 1 || !index("cgknux", *optarg))
131 Usage(1, "-s", optarg);
132 Opt.Sort = *optarg;
133 break;
134 case 'u': Opt.KeyUser = optarg;
135 break;
136 case 'x': if ((Opt.Expdt = getXDate(optarg)) < 0
137 || Opt.Expdt < (time(0)+60)) Usage(1, "-x", optarg);
138 break;
139 default: if (index(validOpts, optopt)) Usage(1, argv[optind-1], optarg);
140 else {eMsg("Invalid option '" <<argv[optind-1] <<"'");
141 Usage(1);
142 }
143 }
144 }
145
146// Make sure and opreration has been specified
147//
148 if (optind >= argc) {eMsg("Action not specified."); Usage(1);}
149
150// Verify the action
151//
152 if (!strcmp(argv[optind], "add")) doIt = doAdd;
153 else if (!strcmp(argv[optind], "install")) doIt = doInst;
154 else if (!strcmp(argv[optind], "del")) doIt = doDel;
155 else if (!strcmp(argv[optind], "list")) doIt = doList;
156 else Usage(1, "parameter", argv[optind]);
157 Opt.Action = argv[optind++];
158
159// Make sure keyname is not too long
160//
161 if (Opt.KeyName && (int)strlen(Opt.KeyName) >= XrdSecsssKT::ktEnt::NameSZ)
162 {eMsg("Key name must be less than " <<XrdSecsssKT::ktEnt::NameSZ
163 << " characters.");
164 exit(4);
165 }
166
167// Make sure username is not too long
168//
169 if (Opt.KeyUser && (int)strlen(Opt.KeyUser) >= XrdSecsssKT::ktEnt::UserSZ)
170 {eMsg("User name must be less than " <<XrdSecsssKT::ktEnt::UserSZ
171 << " characters.");
172 exit(4);
173 }
174
175// Make sure group name is not too long
176//
177 if (Opt.KeyGrup && (int)strlen(Opt.KeyGrup) >= XrdSecsssKT::ktEnt::GrupSZ)
178 {eMsg("group name must be less than " <<XrdSecsssKT::ktEnt::GrupSZ
179 << " characters.");
180 exit(4);
181 }
182
183// Provide default keyfile if none specified
184//
185 if (optind < argc) Opt.KeyFile = argv[optind++];
186 else Opt.KeyFile = XrdSecsssKT::genFN();
187
188// Perform the action
189//
190 switch(doIt)
191 {case doAdd: rc = XrdSecsssAdmin_addKey(Opt); break;
192 case doDel: rc = XrdSecsssAdmin_delKey(Opt); break;
193 case doInst: rc = XrdSecsssAdmin_insKey(Opt); break;
194 case doList: rc = XrdSecsssAdmin_lstKey(Opt); break;
195 default: rc = 16; eMsg("Internal processing error!");
196 }
197
198// All done
199//
200 if (Opt.kTab) delete Opt.kTab;
201 exit(rc);
202}
int optopt
int optind
int XrdSecsssAdmin_insKey(XrdsecsssAdmin_Opts &Opt)
int XrdSecsssAdmin_lstKey(XrdsecsssAdmin_Opts &Opt)
int XrdSecsssAdmin_addKey(XrdsecsssAdmin_Opts &Opt)
time_t getXDate(const char *cDate)
int XrdSecsssAdmin_delKey(XrdsecsssAdmin_Opts &Opt)
#define eMsg(x)
void Usage(int rc, const char *opn, const char *opv)
static const int UserSZ
static const int GrupSZ
static const int maxKLen
static const int NameSZ
static char * genFN()

References XrdsecsssAdmin_Opts::Action, XrdsecsssAdmin_Opts::Debug, eMsg, XrdsecsssAdmin_Opts::Expdt, XrdSecsssKT::genFN(), getXDate(), XrdSecsssKT::ktEnt::GrupSZ, XrdsecsssAdmin_Opts::Keep, XrdsecsssAdmin_Opts::KeyFile, XrdsecsssAdmin_Opts::KeyGrup, XrdsecsssAdmin_Opts::KeyLen, XrdsecsssAdmin_Opts::KeyName, XrdsecsssAdmin_Opts::KeyNum, XrdsecsssAdmin_Opts::KeyUser, XrdsecsssAdmin_Opts::kTab, XrdSecsssKT::ktEnt::maxKLen, XrdSecsssKT::ktEnt::NameSZ, optind, optopt, XrdsecsssAdmin_Opts::Sort, Usage(), XrdSecsssKT::ktEnt::UserSZ, XrdpgmName, XrdSecsssAdmin_addKey(), XrdSecsssAdmin_delKey(), XrdSecsssAdmin_insKey(), and XrdSecsssAdmin_lstKey().

+ Here is the call graph for this function:

◆ Usage()

void Usage ( int  rc,
const char *  opn,
const char *  opv 
)

Definition at line 251 of file XrdSecsssAdmin.cc.

252{
253// Check if we need to issue a message here
254//
255 if (opn)
256 {if (opv) eMsg("Invalid " <<opn <<" argument - " <<opv);
257 else eMsg(opn <<" argument not specified.");
258 }
259
260std::cerr <<"\nUsage: " <<XrdpgmName <<" [options] action\n";
261std::cerr <<"\nOptions: [-d] [-g grpname] [-h hold] [-k keyname] [-l keylen] [-n keynum]";
262std::cerr <<"\n [-s {c|g|k|n|u|x}] [-u usrname] [-x {days | mm/dd/yy}]" <<std::endl;
263std::cerr <<"\nActions: {add | del | install | list} [keyfn]" <<std::endl;
264exit(rc);
265}

References eMsg, and XrdpgmName.

Referenced by main().

+ Here is the caller graph for this function:

◆ XrdSecsssAdmin_addKey()

int XrdSecsssAdmin_addKey ( XrdsecsssAdmin_Opts Opt)

Definition at line 271 of file XrdSecsssAdmin.cc.

272{
273 XrdOucErrInfo eInfo;
274 XrdSecsssKT::ktEnt *ktEnt;
275 int retc, numKeys, numTot, numExp;
276
277// Allocate the initial keytab
278//
279 Opt.kTab = new XrdSecsssKT(&eInfo, Opt.KeyFile, XrdSecsssKT::isAdmin);
280 if ((retc = eInfo.getErrInfo()))
281 {if (retc != ENOENT || isNo(0, "Keyfile '", Opt.KeyFile,
282 "' does not exist. Create it? (y | n): ")) return 4;
283 }
284
285// Construct a new KeyTab entry
286//
287 ktEnt = new XrdSecsssKT::ktEnt;
288 strcpy(ktEnt->Data.Name, (Opt.KeyName ? Opt.KeyName : "nowhere"));
289 strcpy(ktEnt->Data.User, (Opt.KeyUser ? Opt.KeyUser : "nobody"));
290 strcpy(ktEnt->Data.Grup, (Opt.KeyGrup ? Opt.KeyGrup : "nogroup"));
293 else if (Opt.KeyLen < 4) ktEnt->Data.Len = 4;
294 else ktEnt->Data.Len = Opt.KeyLen/4*4;
295 ktEnt->Data.Exp = Opt.Expdt;
296 Opt.kTab->addKey(*ktEnt);
297
298// Now rewrite the file
299//
300 if ((retc = Opt.kTab->Rewrite(Opt.Keep, numKeys, numTot, numExp)))
301 {eMsg("Unable to add key to '" <<Opt.KeyFile <<"'; " <<XrdSysE2T(retc));
302 retc = 8;
303 } else {
304 eMsg(numKeys <<(numKeys == 1 ? " key":" keys") <<" out of "
305 <<numTot <<" kept (" <<numExp <<" expired).");
306 }
307
308// All done
309//
310 return retc;
311}
int isNo(int dflt, const char *Msg1, const char *Msg2, const char *Msg3)
const char * XrdSysE2T(int errcode)
Definition XrdSysE2T.cc:104
struct XrdSecsssKT::ktEnt::ktData Data
int Rewrite(int Keep, int &numKeys, int &numTot, int &numExp)
void addKey(ktEnt &ktNew)

References XrdSecsssKT::addKey(), XrdSecsssKT::ktEnt::Data, eMsg, XrdSecsssKT::ktEnt::ktData::Exp, XrdsecsssAdmin_Opts::Expdt, XrdOucErrInfo::getErrInfo(), XrdSecsssKT::ktEnt::ktData::Grup, XrdSecsssKT::isAdmin, isNo(), XrdsecsssAdmin_Opts::Keep, XrdsecsssAdmin_Opts::KeyFile, XrdsecsssAdmin_Opts::KeyGrup, XrdsecsssAdmin_Opts::KeyLen, XrdsecsssAdmin_Opts::KeyName, XrdsecsssAdmin_Opts::KeyUser, XrdsecsssAdmin_Opts::kTab, XrdSecsssKT::ktEnt::ktData::Len, XrdSecsssKT::ktEnt::maxKLen, XrdSecsssKT::ktEnt::ktData::Name, XrdSecsssKT::Rewrite(), XrdSecsssKT::ktEnt::ktData::User, and XrdSysE2T().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ XrdSecsssAdmin_delKey()

int XrdSecsssAdmin_delKey ( XrdsecsssAdmin_Opts Opt)

Definition at line 317 of file XrdSecsssAdmin.cc.

318{
319 XrdOucErrInfo eInfo;
320 XrdSecsssKT::ktEnt ktEnt;
321 int retc, numKeys, numTot, numExp, numDel;
322
323// Allocate the initial keytab
324//
325 Opt.kTab = new XrdSecsssKT(&eInfo, Opt.KeyFile, XrdSecsssKT::isAdmin);
326 if ((retc = eInfo.getErrInfo()))
327 {if (retc == ENOENT)
328 {eMsg("Keyfile '" <<Opt.KeyFile <<"' does not exist.");}
329 return 4;
330 }
331
332// Construct deletion reference
333//
334 if (Opt.KeyName) strcpy(ktEnt.Data.Name, Opt.KeyName);
335 if (Opt.KeyUser) strcpy(ktEnt.Data.User, Opt.KeyUser);
336 if (Opt.KeyGrup) strcpy(ktEnt.Data.Grup, Opt.KeyGrup);
337 ktEnt.Data.ID = static_cast<long long>(Opt.KeyNum);
338
339// Delete the keys from the key table
340//
341 if (!(numDel = Opt.kTab->delKey(ktEnt)))
342 {eMsg("No matching key(s) found.");
343 return 4;
344 }
345
346// It's possible that all of the keys were deleted. Check for that
347//
348 if (Opt.kTab->keyList() == 0)
349 {if (isNo(1, "No keys will remain in ", Opt.KeyFile,
350 ". Delete file? (n | y): "))
351 {eMsg("No keys deleted!"); return 2;}
352 unlink(Opt.KeyFile);
353 return 0;
354 }
355
356// Now rewrite the file
357//
358 if ((retc = Opt.kTab->Rewrite(Opt.Keep, numKeys, numTot, numExp)))
359 {eMsg("Unable to del key from '" <<Opt.KeyFile <<"'; " <<XrdSysE2T(retc));
360 retc = 8;
361 } else {
362 eMsg(numKeys <<(numKeys == 1 ? " key":" keys") <<" out of "
363 <<(numTot+numDel) <<" kept (" <<numExp <<" expired).");
364 }
365
366// All done
367//
368 return retc;
369}
#define unlink(a)
Definition XrdPosix.hh:108
int delKey(ktEnt &ktDel)
ktEnt * keyList()

References XrdSecsssKT::ktEnt::Data, XrdSecsssKT::delKey(), eMsg, XrdOucErrInfo::getErrInfo(), XrdSecsssKT::ktEnt::ktData::Grup, XrdSecsssKT::ktEnt::ktData::ID, XrdSecsssKT::isAdmin, isNo(), XrdsecsssAdmin_Opts::Keep, XrdsecsssAdmin_Opts::KeyFile, XrdsecsssAdmin_Opts::KeyGrup, XrdSecsssKT::keyList(), XrdsecsssAdmin_Opts::KeyName, XrdsecsssAdmin_Opts::KeyNum, XrdsecsssAdmin_Opts::KeyUser, XrdsecsssAdmin_Opts::kTab, XrdSecsssKT::ktEnt::ktData::Name, XrdSecsssKT::Rewrite(), unlink, XrdSecsssKT::ktEnt::ktData::User, and XrdSysE2T().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ XrdSecsssAdmin_Here()

int XrdSecsssAdmin_Here ( char  sType,
XrdSecsssKT::ktEnt ktX,
XrdSecsssKT::ktEnt ktS 
)

Definition at line 436 of file XrdSecsssAdmin.cc.

438{
439 int n;
440 char *sf1, *sf2;
441
442 switch(sType)
443 {case 'c': return ktX->Data.Crt < ktS->Data.Crt;
444 case 'g': sf1 = ktX->Data.Grup; sf2 = ktS->Data.Grup; break;
445 case 'k': sf1 = ktX->Data.Name; sf2 = ktS->Data.Name; break;
446 case 'n': return (ktX->Data.ID & 0x7fffffff) < (ktS->Data.ID & 0x7fffffff);
447 case 'u': sf1 = ktX->Data.User; sf2 = ktS->Data.User; break;
448 case 'x': return ktX->Data.Exp < ktS->Data.Exp;
449 default: return 0;
450 }
451
452 if ((n = strcmp(sf1, sf2))) return n < 0;
453 return (ktX->Data.ID & 0x7fffffff) < (ktS->Data.ID & 0x7fffffff);
454}

References XrdSecsssKT::ktEnt::ktData::Crt, XrdSecsssKT::ktEnt::Data, XrdSecsssKT::ktEnt::ktData::Exp, XrdSecsssKT::ktEnt::ktData::Grup, XrdSecsssKT::ktEnt::ktData::ID, XrdSecsssKT::ktEnt::ktData::Name, and XrdSecsssKT::ktEnt::ktData::User.

Referenced by XrdSecsssAdmin_lstKey().

+ Here is the caller graph for this function:

◆ XrdSecsssAdmin_insKey()

int XrdSecsssAdmin_insKey ( XrdsecsssAdmin_Opts Opt)

Definition at line 375 of file XrdSecsssAdmin.cc.

376{
378 XrdSecsssKT::ktEnt *ktP);
379 XrdOucErrInfo eInfo;
381 int retc, numKeys = 0, numTot, numExp;
382
383// Allocate the initial keytab
384//
385 Opt.kTab = new XrdSecsssKT(&eInfo, 0, XrdSecsssKT::isAdmin);
386 if ((retc = eInfo.getErrInfo())) return 4;
387
388// Check if we need to trim the keytab to a particular key
389//
390 if (Opt.KeyName || Opt.KeyUser || Opt.KeyGrup)
391 {ktP = Opt.kTab->keyList();
392 while(ktP)
393 {if (!XrdSecsssAdmin_isKey(Opt, ktP)) ktP->Data.Name[0] = '\0';
394 else numKeys++;
395 ktP = ktP->Next;
396 }
397 if (!numKeys)
398 {eMsg("No keys named " <<Opt.KeyName <<" found to install.");
399 return 8;
400 }
401 }
402
403// Now rewrite the file
404//
405 Opt.kTab->setPath(Opt.KeyFile);
406 if ((retc = Opt.kTab->Rewrite(Opt.Keep, numKeys, numTot, numExp)))
407 {eMsg("Unable to install keytab '" <<Opt.KeyFile <<"'; " <<XrdSysE2T(retc));
408 retc = 8;
409 } else {
410 eMsg(numKeys <<(numKeys == 1 ? " key":" keys") <<" out of "
411 <<numTot <<" installed (" <<numExp <<" expired).");
412 }
413
414// All done
415//
416 return retc;
417}
int XrdSecsssAdmin_isKey(XrdsecsssAdmin_Opts &Opt, XrdSecsssKT::ktEnt *ktP)
void setPath(const char *Path)

References XrdSecsssKT::ktEnt::Data, eMsg, XrdOucErrInfo::getErrInfo(), XrdSecsssKT::isAdmin, XrdsecsssAdmin_Opts::Keep, XrdsecsssAdmin_Opts::KeyFile, XrdsecsssAdmin_Opts::KeyGrup, XrdSecsssKT::keyList(), XrdsecsssAdmin_Opts::KeyName, XrdsecsssAdmin_Opts::KeyUser, XrdsecsssAdmin_Opts::kTab, XrdSecsssKT::ktEnt::ktData::Name, XrdSecsssKT::ktEnt::Next, XrdSecsssKT::Rewrite(), XrdSecsssKT::setPath(), XrdSecsssAdmin_isKey(), and XrdSysE2T().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ XrdSecsssAdmin_isKey()

int XrdSecsssAdmin_isKey ( XrdsecsssAdmin_Opts Opt,
XrdSecsssKT::ktEnt ktP 
)

Definition at line 423 of file XrdSecsssAdmin.cc.

425{
426 if (Opt.KeyName && strcmp(ktP->Data.Name, Opt.KeyName)) return 0;
427 if (Opt.KeyUser && strcmp(ktP->Data.User, Opt.KeyUser)) return 0;
428 if (Opt.KeyGrup && strcmp(ktP->Data.Grup, Opt.KeyGrup)) return 0;
429 return 1;
430}

References XrdSecsssKT::ktEnt::Data, XrdSecsssKT::ktEnt::ktData::Grup, XrdsecsssAdmin_Opts::KeyGrup, XrdsecsssAdmin_Opts::KeyName, XrdsecsssAdmin_Opts::KeyUser, XrdSecsssKT::ktEnt::ktData::Name, and XrdSecsssKT::ktEnt::ktData::User.

Referenced by XrdSecsssAdmin_insKey(), and XrdSecsssAdmin_lstKey().

+ Here is the caller graph for this function:

◆ XrdSecsssAdmin_lstKey()

int XrdSecsssAdmin_lstKey ( XrdsecsssAdmin_Opts Opt)

Definition at line 460 of file XrdSecsssAdmin.cc.

461{
462 static const char Hdr1[] =
463 " Number Len Date/Time Created Expires Keyname User & Group\n";
464// 12345678901 123 mm/dd/yy hh:mm:ss mm/dd/yy
465 static const char Hdr2[] =
466 " ------ --- --------- ------- -------- -------\n";
467
469 XrdSecsssKT::ktEnt *ktP);
470 XrdOucErrInfo eInfo;
471 XrdSecsssKT::ktEnt *ktP, *ktSort = 0, *ktS, *ktSP, *ktX;
472 char crfmt[] = "%D %T", exfmt[] = "%D";
473 char buff[128], crbuff[64], exbuff[16];
474 int retc, pHdr = 1;
475
476// Allocate the initial keytab
477//
478 Opt.kTab = new XrdSecsssKT(&eInfo, Opt.KeyFile, XrdSecsssKT::isAdmin);
479 if ((retc = eInfo.getErrInfo()))
480 {if (retc == ENOENT)
481 {eMsg("Keyfile '" <<Opt.KeyFile <<"' does not exist.");}
482 return 4;
483 }
484
485// Obtain the keytab list
486//
487 if ((ktP = Opt.kTab->keyList()))
488 {ktSort = ktP; ktP = ktP->Next; ktSort->Next = 0;}
489
490// Sort the list
491//
492 while(ktP)
493 {ktS = ktSort; ktSP = 0; ktX = ktP; ktP = ktP->Next; ktX->Next = 0;
494 while(ktS)
495 {if (XrdSecsssAdmin_Here(Opt.Sort, ktX, ktS))
496 {if (ktSP) {ktX->Next = ktS; ktSP->Next = ktX;}
497 else {ktX->Next = ktSort; ktSort = ktX;}
498 break;
499 }
500 ktSP = ktS; ktS = ktS->Next;
501 }
502 if (!ktS) ktSP->Next = ktX;
503 }
504
505// List the keys
506//
507 ktP = ktSort;
508 while(ktP)
509 {if (XrdSecsssAdmin_isKey(Opt, ktP))
510 {if (pHdr) {std::cout <<Hdr1 <<Hdr2; pHdr = 0;}
511 sprintf(buff, "%11lld %3d ", (ktP->Data.ID & 0x7fffffff), ktP->Data.Len);
512 strftime(crbuff, sizeof(crbuff), crfmt, localtime(&ktP->Data.Crt));
513 if (!ktP->Data.Exp) strcpy(exbuff, "--------");
514 else strftime(exbuff,sizeof(exbuff),exfmt,localtime(&ktP->Data.Exp));
515 std::cout <<buff <<crbuff <<' ' <<exbuff <<' ' <<ktP->Data.Name <<' '
516 <<ktP->Data.User <<' ' <<ktP->Data.Grup <<std::endl;
517 }
518 ktP = ktP->Next;
519 }
520
521// Check if we printed anything
522//
523 if (pHdr)
524 {if (Opt.KeyName) eMsg(Opt.KeyName <<" key not found in " <<Opt.KeyFile);
525 else eMsg("No keys found in " <<Opt.KeyFile);
526 }
527 return 0;
528}
int XrdSecsssAdmin_Here(char sType, XrdSecsssKT::ktEnt *ktX, XrdSecsssKT::ktEnt *ktS)

References XrdSecsssKT::ktEnt::ktData::Crt, XrdSecsssKT::ktEnt::Data, eMsg, XrdSecsssKT::ktEnt::ktData::Exp, XrdOucErrInfo::getErrInfo(), XrdSecsssKT::ktEnt::ktData::Grup, XrdSecsssKT::ktEnt::ktData::ID, XrdSecsssKT::isAdmin, XrdsecsssAdmin_Opts::KeyFile, XrdSecsssKT::keyList(), XrdsecsssAdmin_Opts::KeyName, XrdsecsssAdmin_Opts::kTab, XrdSecsssKT::ktEnt::ktData::Len, XrdSecsssKT::ktEnt::ktData::Name, XrdSecsssKT::ktEnt::Next, XrdsecsssAdmin_Opts::Sort, XrdSecsssKT::ktEnt::ktData::User, XrdSecsssAdmin_Here(), and XrdSecsssAdmin_isKey().

Referenced by main().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ XrdpgmName

const char* XrdpgmName
static

Definition at line 80 of file XrdSecsssAdmin.cc.

Referenced by isNo(), main(), and Usage().