1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License, Version 1.0 only
   6  * (the "License").  You may not use this file except in compliance
   7  * with the License.
   8  *
   9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10  * or http://www.opensolaris.org/os/licensing.
  11  * See the License for the specific language governing permissions
  12  * and limitations under the License.
  13  *
  14  * When distributing Covered Code, include this CDDL HEADER in each
  15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16  * If applicable, add the following below this CDDL HEADER, with the
  17  * fields enclosed by brackets "[]" replaced with your own identifying
  18  * information: Portions Copyright [yyyy] [name of copyright owner]
  19  *
  20  * CDDL HEADER END
  21  */
  22 #pragma ident   "%Z%%M% %I%     %E% SMI"
  23 
  24 /*
  25  * rusers_simple.c
  26  * These are the "easy to use" interfaces to rusers.
  27  *
  28  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  29  * Use is subject to license terms.
  30  */
  31 
  32 #include <string.h>
  33 #include <rpc/rpc.h>
  34 #include <rpcsvc/rusers.h>
  35 #include <stdlib.h>
  36 
  37 int
  38 rusers3(host, uap)
  39         char *host;
  40         utmp_array *uap;
  41 {
  42         struct utmpidlearr up;
  43 
  44         if (rpc_call(host, RUSERSPROG, RUSERSVERS_3, RUSERSPROC_NAMES,
  45                         xdr_void, (char *) NULL,
  46                         xdr_utmp_array, (char *) uap, (char *) NULL) != 0) {
  47                 /*
  48                  * If version 3 isn't available, try version 2.  We'll have to
  49                  * convert a utmpidlearr structure into a utmp_array.
  50                  */
  51                 up.uia_cnt = 0;
  52                 up.uia_arr = NULL;
  53                 if (rusers(host, &up) != 0)
  54                         return (-1);
  55                 else {
  56                         int i;
  57                         struct ru_utmp forsize;
  58                         rusers_utmp *rutp;
  59 
  60                         uap->utmp_array_val = (rusers_utmp *)malloc(up.uia_cnt
  61                                 * sizeof (rusers_utmp));
  62                         if (uap->utmp_array_val == NULL) {
  63                                 xdr_free(xdr_utmpidlearr, (char *)&up);
  64                                 return (-1);
  65                         }
  66                         uap->utmp_array_len = up.uia_cnt;
  67                         for (rutp = uap->utmp_array_val, i = 0;
  68                                 i < up.uia_cnt; rutp++, i++) {
  69                                 rutp->ut_line = (char *)malloc(sizeof
  70                                         (forsize.ut_line)+1);
  71                                 rutp->ut_user = (char *)malloc(sizeof
  72                                         (forsize.ut_name)+1);
  73                                 rutp->ut_host = (char *)malloc(sizeof
  74                                         (forsize.ut_host)+1);
  75                                 if (rutp->ut_line == NULL ||
  76                                         rutp->ut_user == NULL ||
  77                                         rutp->ut_host == NULL) {
  78 
  79                                         while (--rutp >= uap->utmp_array_val) {
  80                                                 free(rutp->ut_line);
  81                                                 free(rutp->ut_user);
  82                                                 free(rutp->ut_host);
  83                                         }
  84                                         free(uap->utmp_array_val);
  85                                         xdr_free(xdr_utmpidlearr, (char *)&up);
  86                                         return (-1);
  87                                 }
  88                                 strncpy(rutp->ut_line,
  89                                         up.uia_arr[i]->ui_utmp.ut_line,
  90                                         sizeof (forsize.ut_line)+1);
  91                                 strncpy(rutp->ut_user,
  92                                         up.uia_arr[i]->ui_utmp.ut_name,
  93                                         sizeof (forsize.ut_name)+1);
  94                                 strncpy(rutp->ut_host,
  95                                         up.uia_arr[i]->ui_utmp.ut_host,
  96                                         sizeof (forsize.ut_host)+1);
  97                                 rutp->ut_idle = up.uia_arr[i]->ui_idle;
  98                                 rutp->ut_time = up.uia_arr[i]->ui_utmp.ut_time;
  99                                 rutp->ut_type = RUSERS_USER_PROCESS;
 100                                                         /* assume this */
 101                         }
 102                         xdr_free(xdr_utmpidlearr, (char *)&up);
 103                 }
 104         }
 105         return (0);
 106 }
 107 
 108 int
 109 rnusers(host)
 110         char *host;
 111 {
 112         int nusers;
 113 
 114         if (rpc_call(host, RUSERSPROG, RUSERSVERS_3, RUSERSPROC_NUM,
 115                         xdr_void, (char *) NULL,
 116                         xdr_u_int, (char *) &nusers, (char *) NULL) != 0) {
 117                 if (rpc_call(host, RUSERSPROG, RUSERSVERS_IDLE, RUSERSPROC_NUM,
 118                         xdr_void, (char *) NULL,
 119                         xdr_u_int, (char *) &nusers, (char *) NULL) != 0)
 120                 return (-1);
 121         }
 122         return (nusers);
 123 }
 124 
 125 enum clnt_stat
 126 rusers(host, up)
 127         char *host;
 128         struct utmpidlearr *up;
 129 {
 130         return (rpc_call(host, RUSERSPROG, RUSERSVERS_IDLE, RUSERSPROC_NAMES,
 131                         xdr_void, (char *) NULL,
 132                         xdr_utmpidlearr, (char *) up, (char *) NULL));
 133 }
 134