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/pxfgetpwnam.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 #include "pxfstruct.h"
00047 #include "table.h"
00048
00049 extern char *_fc_acopy(_fcd f);
00050
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
00088
00089
00090
00091
00092 #ifdef _UNICOS
00093 void
00094 PXFGETPWNAM(
00095 #else
00096 void
00097 _PXFGETPWNAM(
00098 #endif
00099 _fcd NAME,
00100 _f_int *ILEN,
00101 _f_int *JPASSWD,
00102 _f_int *IERROR
00103 )
00104 {
00105 int cilen;
00106 char *cname;
00107 struct passwd *passwdsrc, passwdtemp, *cjpasswd;
00108 struct pxfhandle pxfhand;
00109
00110 cilen = *ILEN;
00111 pxfhand = _pxfhandle_table_lookup(&_pxfhandle_table, *JPASSWD);
00112 if (pxfhand.pxfstructptr == NULL || pxfhand.pxftype != PXF_PASSWD) {
00113 *IERROR = EBADHANDLE;
00114 return;
00115 }
00116 cjpasswd = pxfhand.pxfstructptr;
00117
00118
00119 if (cilen < 0 || cilen > _fcdlen(NAME)) {
00120 *IERROR = EINVAL;
00121 } else {
00122
00123 if (cilen == 0) {
00124
00125
00126
00127
00128
00129 cname = _fc_acopy(NAME);
00130
00131 } else {
00132 cname = (char *) malloc (cilen + 1);
00133 if (cname != NULL) {
00134 (void)memcpy(cname, _fcdtocp(NAME), cilen);
00135 cname[cilen] ='\0';
00136 } else {
00137 *IERROR = ENOMEM;
00138 return;
00139 }
00140 }
00141
00142
00143 if ((passwdsrc = getpwnam(cname)) != NULL) {
00144
00145 free(cname);
00146
00147
00148
00149 passwdtemp.pw_name =
00150 (char *) malloc((strlen(passwdsrc->pw_name)+1)*sizeof(char));
00151 if (passwdtemp.pw_name == NULL) {
00152 *IERROR = ENOMEM;
00153 return;
00154 }
00155 (void)strcpy(passwdtemp.pw_name, passwdsrc->pw_name);
00156
00157
00158 passwdtemp.pw_uid = passwdsrc->pw_uid;
00159
00160
00161 passwdtemp.pw_gid = passwdsrc->pw_gid;
00162
00163
00164 passwdtemp.pw_dir =
00165 (char *) malloc((strlen(passwdsrc->pw_dir)+1)*sizeof(char));
00166 if (passwdtemp.pw_dir == NULL) {
00167 *IERROR = ENOMEM;
00168 free(passwdtemp.pw_name);
00169 return;
00170 }
00171 (void)strcpy(passwdtemp.pw_dir, passwdsrc->pw_dir);
00172
00173
00174 passwdtemp.pw_shell =
00175 (char *) malloc((strlen(passwdsrc->pw_shell)+1)*sizeof(char));
00176 if (passwdtemp.pw_shell == NULL) {
00177 *IERROR = ENOMEM;
00178 free(passwdtemp.pw_name);
00179 free(passwdtemp.pw_dir);
00180 return;
00181 }
00182 (void)strcpy(passwdtemp.pw_shell, passwdsrc->pw_shell);
00183
00184
00185
00186 passwdtemp.pw_passwd =
00187 (char *)malloc((strlen(passwdsrc->pw_passwd)+1)*sizeof(char));
00188 if (passwdtemp.pw_passwd == NULL) {
00189 *IERROR = ENOMEM;
00190 free(passwdtemp.pw_name);
00191 free(passwdtemp.pw_dir);
00192 free(passwdtemp.pw_shell);
00193 return;
00194 }
00195 (void)strcpy(passwdtemp.pw_passwd, passwdsrc->pw_passwd);
00196
00197 #ifndef _LITTLE_ENDIAN
00198
00199 passwdtemp.pw_age =
00200 (char *)malloc((strlen(passwdsrc->pw_age)+1)*sizeof(char));
00201 if (passwdtemp.pw_age == NULL) {
00202 *IERROR = ENOMEM;
00203 free(passwdtemp.pw_name);
00204 free(passwdtemp.pw_dir);
00205 free(passwdtemp.pw_shell);
00206 free(passwdtemp.pw_passwd);
00207 return;
00208 }
00209 (void)strcpy(passwdtemp.pw_age, passwdsrc->pw_age);
00210
00211
00212 passwdtemp.pw_comment =
00213 (char *)malloc((strlen(passwdsrc->pw_comment)+1)*sizeof(char));
00214 if (passwdtemp.pw_comment == NULL) {
00215 *IERROR = ENOMEM;
00216 free(passwdtemp.pw_name);
00217 free(passwdtemp.pw_dir);
00218 free(passwdtemp.pw_shell);
00219 free(passwdtemp.pw_passwd);
00220 free(passwdtemp.pw_age);
00221 return;
00222 }
00223 (void)strcpy(passwdtemp.pw_comment, passwdsrc->pw_comment);
00224 #endif
00225
00226
00227 passwdtemp.pw_gecos =
00228 (char *)malloc((strlen(passwdsrc->pw_gecos)+1)*sizeof(char));
00229 if (passwdtemp.pw_gecos == NULL) {
00230 *IERROR = ENOMEM;
00231 free(passwdtemp.pw_name);
00232 free(passwdtemp.pw_dir);
00233 free(passwdtemp.pw_shell);
00234 free(passwdtemp.pw_passwd);
00235 #ifndef _LITTLE_ENDIAN
00236 free(passwdtemp.pw_age);
00237 #endif
00238 free(passwdtemp.pw_gecos);
00239 return;
00240 }
00241 (void)strcpy(passwdtemp.pw_gecos, passwdsrc->pw_gecos);
00242
00243 } else {
00244 *IERROR = errno;
00245 free(cname);
00246 return;
00247 }
00248 }
00249
00250
00251
00252 free(cjpasswd->pw_name);
00253 free(cjpasswd->pw_passwd);
00254 #ifndef _LITTLE_ENDIAN
00255 free(cjpasswd->pw_age);
00256 free(cjpasswd->pw_comment);
00257 #endif
00258 free(cjpasswd->pw_gecos);
00259 free(cjpasswd->pw_dir);
00260 free(cjpasswd->pw_shell);
00261
00262 *cjpasswd = passwdtemp;
00263 }
00264
00265 #ifndef _UNICOS
00266 void
00267 pxfgetpwnam_(
00268 char *NAME,
00269 _f_int *ILEN,
00270 _f_int *JPASSWD,
00271 _f_int *IERROR,
00272 _f_int namelen
00273 )
00274 {
00275 _PXFGETPWNAM(_cptofcd(NAME,namelen),ILEN,JPASSWD,IERROR);
00276 }
00277 #endif
00278