00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #pragma ident "@(#) libf/pxf/pxfgetpwuid.c 92.3 10/29/99 21:41:49"
00038
00039
00040 #include <fortran.h>
00041 #include <errno.h>
00042 #include <liberrno.h>
00043 #include <malloc.h>
00044 #include <pwd.h>
00045 #include <string.h>
00046 #ifdef _LITTLE_ENDIAN
00047 #include <sys/types.h>
00048 #endif
00049 #include "pxfstruct.h"
00050 #include "table.h"
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 #ifdef _UNICOS
00088 void
00089 PXFGETPWUID(
00090 #else
00091 void
00092 _PXFGETPWUID(
00093 #endif
00094 _f_int *IUID,
00095 _f_int *JPASSWD,
00096 _f_int *IERROR
00097 )
00098 {
00099 char *cname;
00100 struct passwd *passwdsrc, passwdtemp, *cjpasswd;
00101 struct pxfhandle pxfhand;
00102
00103 pxfhand = _pxfhandle_table_lookup(&_pxfhandle_table, *JPASSWD);
00104 if (pxfhand.pxfstructptr == NULL || pxfhand.pxftype != PXF_PASSWD) {
00105 *IERROR = EBADHANDLE;
00106 return;
00107 }
00108 cjpasswd = (struct passwd *)pxfhand.pxfstructptr;
00109
00110
00111 if ((passwdsrc = getpwuid((uid_t)*IUID)) != NULL) {
00112
00113
00114
00115 passwdtemp.pw_name =
00116 (char *) malloc((strlen(passwdsrc->pw_name)+1)*sizeof(char));
00117 if (passwdtemp.pw_name == NULL) {
00118 *IERROR = ENOMEM;
00119 return;
00120 }
00121 (void)strcpy(passwdtemp.pw_name, passwdsrc->pw_name);
00122
00123
00124 passwdtemp.pw_uid = passwdsrc->pw_uid;
00125
00126
00127 passwdtemp.pw_gid = passwdsrc->pw_gid;
00128
00129
00130 passwdtemp.pw_dir =
00131 (char *) malloc((strlen(passwdsrc->pw_dir)+1)*sizeof(char));
00132 if (passwdtemp.pw_dir == NULL) {
00133 *IERROR = ENOMEM;
00134 free(passwdtemp.pw_name);
00135 return;
00136 }
00137 (void)strcpy(passwdtemp.pw_dir, passwdsrc->pw_dir);
00138
00139
00140 passwdtemp.pw_shell =
00141 (char *) malloc((strlen(passwdsrc->pw_shell)+1)*sizeof(char));
00142 if (passwdtemp.pw_shell == NULL) {
00143 *IERROR = ENOMEM;
00144 free(passwdtemp.pw_name);
00145 free(passwdtemp.pw_dir);
00146 return;
00147 }
00148 (void)strcpy(passwdtemp.pw_shell, passwdsrc->pw_shell);
00149
00150
00151
00152 passwdtemp.pw_passwd =
00153 (char *)malloc((strlen(passwdsrc->pw_passwd)+1)*sizeof(char));
00154 if (passwdtemp.pw_passwd == NULL) {
00155 *IERROR = ENOMEM;
00156 free(passwdtemp.pw_name);
00157 free(passwdtemp.pw_dir);
00158 free(passwdtemp.pw_shell);
00159 return;
00160 }
00161 (void)strcpy(passwdtemp.pw_passwd, passwdsrc->pw_passwd);
00162
00163 #ifndef _LITTLE_ENDIAN
00164
00165 passwdtemp.pw_age =
00166 (char *)malloc((strlen(passwdsrc->pw_age)+1)*sizeof(char));
00167 if (passwdtemp.pw_age == NULL) {
00168 *IERROR = ENOMEM;
00169 free(passwdtemp.pw_name);
00170 free(passwdtemp.pw_dir);
00171 free(passwdtemp.pw_shell);
00172 free(passwdtemp.pw_passwd);
00173 return;
00174 }
00175 (void)strcpy(passwdtemp.pw_age, passwdsrc->pw_age);
00176
00177
00178 passwdtemp.pw_comment =
00179 (char *)malloc((strlen(passwdsrc->pw_comment)+1)*sizeof(char));
00180 if (passwdtemp.pw_comment == NULL) {
00181 *IERROR = ENOMEM;
00182 free(passwdtemp.pw_name);
00183 free(passwdtemp.pw_dir);
00184 free(passwdtemp.pw_shell);
00185 free(passwdtemp.pw_passwd);
00186 free(passwdtemp.pw_age);
00187 return;
00188 }
00189 (void)strcpy(passwdtemp.pw_comment, passwdsrc->pw_comment);
00190 #endif
00191
00192
00193 passwdtemp.pw_gecos =
00194 (char *)malloc((strlen(passwdsrc->pw_gecos)+1)*sizeof(char));
00195 if (passwdtemp.pw_gecos == NULL) {
00196 *IERROR = ENOMEM;
00197 free(passwdtemp.pw_name);
00198 free(passwdtemp.pw_dir);
00199 free(passwdtemp.pw_shell);
00200 free(passwdtemp.pw_passwd);
00201 #ifndef _LITTLE_ENDIAN
00202 free(passwdtemp.pw_age);
00203 #endif
00204 free(passwdtemp.pw_gecos);
00205 return;
00206 }
00207 (void)strcpy(passwdtemp.pw_gecos, passwdsrc->pw_gecos);
00208
00209 } else {
00210 *IERROR = errno;
00211 return;
00212 }
00213
00214
00215
00216 free(cjpasswd->pw_name);
00217 free(cjpasswd->pw_passwd);
00218 #ifndef _LITTLE_ENDIAN
00219 free(cjpasswd->pw_age);
00220 free(cjpasswd->pw_comment);
00221 #endif
00222 free(cjpasswd->pw_gecos);
00223 free(cjpasswd->pw_dir);
00224 free(cjpasswd->pw_shell);
00225
00226 *cjpasswd = passwdtemp;
00227 }
00228
00229 #ifndef _UNICOS
00230 void
00231 pxfgetpwuid_(
00232 _f_int *IUID,
00233 _f_int *JPASSWD,
00234 _f_int *IERROR
00235 )
00236 {
00237 _PXFGETPWUID(IUID,JPASSWD,IERROR);
00238 }
00239 #endif