struct utmpx * pututxline(const struct utmpx *utx) { struct passwd *pw; struct lastlogx ll; struct utmpx temp, *u = NULL; int gotlock = 0; _DIAGASSERT(utx != NULL); if (utx == NULL) return NULL; if (utx->ut_type == USER_PROCESS) { ll.ll_tv = utx->ut_tv; strcpy(ll.ll_host, utx->ut_host); strcpy(ll.ll_line, utx->ut_line); pw = getpwnam(utx->ut_name); if (pw != NULL) updlastlogx(_PATH_LASTLOGX, pw->pw_uid, &ll); } if (strcmp(_PATH_UTMPX, utfile) == 0) if ((fp != NULL && readonly) || (fp == NULL && geteuid() != 0)) return utmp_update(utx); (void)memcpy(&temp, utx, sizeof(temp)); if (fp == NULL) { (void)getutxent(); if (fp == NULL || readonly) return NULL; } if (getutxid(&temp) == NULL) { setutxent(); if (getutxid(&temp) == NULL) { if (lockf(fileno(fp), F_LOCK, (off_t)0) == -1) return NULL; gotlock++; if (fseeko(fp, (off_t)0, SEEK_END) == -1) goto fail; } } if (!gotlock) { /* we are not appending */ if (fseeko(fp, -(off_t)sizeof(ut), SEEK_CUR) == -1) return NULL; } if (fwrite(&temp, sizeof (temp), 1, fp) != 1) goto fail; if (fflush(fp) == -1) goto fail; u = memcpy(&ut, &temp, sizeof(ut)); fail: if (gotlock) { if (lockf(fileno(fp), F_ULOCK, (off_t)0) == -1) return NULL; } return u; }
struct utmpx * pututxline(const struct utmpx *utx) { struct utmpx temp, *u = NULL; int gotlock = 0; _DIAGASSERT(utx != NULL); if (utx == NULL) return NULL; if (strcmp(_PATH_UTMPX, utfile) == 0) { if (geteuid() == 0) { if (fp != NULL && readonly) endutxent(); } else { if (fp == NULL || readonly) return utmp_update(utx); } } (void)memcpy(&temp, utx, sizeof(temp)); if (fp == NULL) { (void)getutxent(); if (fp == NULL || readonly) return NULL; } if (getutxid(&temp) == NULL) { setutxent(); if (getutxid(&temp) == NULL) { if (lockf(fileno(fp), F_LOCK, (off_t)0) == -1) return NULL; gotlock++; if (fseeko(fp, (off_t)0, SEEK_END) == -1) goto fail; } } if (!gotlock) { /* we are not appending */ if (fseeko(fp, -(off_t)sizeof(ut), SEEK_CUR) == -1) return NULL; } if (version == 1) new2old(&temp); if (fwrite(&temp, sizeof (temp), 1, fp) != 1) goto fail; if (fflush(fp) == -1) goto fail; u = memcpy(&ut, &temp, sizeof(ut)); fail: if (gotlock) { if (lockf(fileno(fp), F_ULOCK, (off_t)0) == -1) return NULL; } return u; }